-前回の解答は授業フォルダ/第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);



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS