-前回の解答は授業フォルダ/第14回/配布に置きました **問題 [#rf29e21e] [[前回>プログラミング基礎/2012/2012年12月20日]]のプログラムを改良し,ユーザがマウスをクリックするとUFOが複数の弾を同時に撃てるようにせよ. 実行例: #ref(./toi.wmv); ヒント: 多数の弾を扱う,これは,Bulletクラスのインスタンスが複数個同時に存在することになる.~ よって配列の出番となる. 具体的には,いままで扱う弾の数が1個であるので,UFOのbullet属性は以下のように宣言していた. Bullet bullet; これでは1個の弾しか存在することができない.よって配列を使用し, Bullet[] bullet; とする. 配列が生成された時点で,配列の各場所には"空"であることを示す null が代入されている. そのため,例えば配列のi番目が空かどうかは,以下のように判定できる if (bullet[i] == null) { //bulletのi番目が空であれば...する } 空の場所に対して何らかのメソッドを実行しようとすると,不正な処理としてプログラム実行中に,プログラムが停止してしまうので注意すること. 具体的には,配列が空でないかをチェックしてから,メソッドを実行しなければいけない.よって,次のようなプログラムとなる. if (bullet[i] != null)//配列のi番目が空でなければ... { //i番目の弾を動かす bullet[i].move(); } プログラムひな形(UFOクラス): class UFO { float x; float y; float sx = 2; int type; Bullet[] bullet; UFO(float x, float y, int type) { this.x = x; this.y = y; this.type = type; //配列を生成する } void shoot() { //配列内の空き場所に弾を生成する } void removeBullets() { //配列内の不要な弾(画面外にでてしまった弾)を削除する } void moveBullets() { //配列内の弾を全て動かす } void drawBullets() { //配列内の弾を全て描画する } void move() { //UFOの移動(省略) removeBullets(); moveBullets(); } void draw() { //UFOの描画(省略) drawBullets(); } } 実行例: #ref(./toi.wmv);