

横向きの単純なシューティングゲームをjavaで作っているのですが、弾を正常に発射することができません。本来クリックをするごとに弾を1発ずつ発射するようにしたいのですが、二回目のクリックから弾が正常に動きません。自機の操作と敵機の動きはすでに完成しています。

おそらく `//////` で囲まれている部分が原因だと思うのですが解決方法がわかりません。  
教えていただけると幸いです。

* * *

**自分がやろうとしている弾の動作方法**  
[![自分がやろうとしている弾の動作方法](https://i.stack.imgur.com/wb1Sz.jpg)](https://i.stack.imgur.com/wb1Sz.jpg)

**現状のソースコード**

[code]

    MyCharacter mc;//自機
    Enemy enemy[]=new Enemy [10]; //敵を格納する配列
    Bullet bullet[]=new Bullet[10];//弾を格納する配列
    boolean  bulletJudge;//弾が発射されているかどうか判別する
    int bulletCount;//発射中の弾数
    
    void setup(){
        size(800,800);
        mc = new MyCharacter();
        for(int i=0;i<10;i++){
          enemy[i] = new Enemy();
        }
        for(int i=0;i<10;i++){
          bullet[i] = new Bullet();
        }
        bulletJudge=false;
        bulletCount=0;
    }
    void draw(){
        background(255);
        mc.display();//自機を表示
        mc.update();//自機を表示する座標を更新
        for(int i=0;i<10;i++){  
          enemy[i].display();//敵を表示
          enemy[i].update();//敵を表示する座標を更新
        }
    /////////////////////////////////////////////////////////////
        if(mousePressed){
          bulletJudge=true;//弾が発射されていると判別
          bulletCount++;//発射中の弾数をカウント
          if(bulletCount>9){//画面上に同時に表示可能な弾数を10発に制限
            bulletCount=0;
          }
        }
        if(bulletJudge){//弾が発射されている場合
          for(int i=0;i<bulletCount;i++){//発射中の弾それぞれのパラメーターを変更
            if(!bullet[i].isDead){//発射した弾が画面内にある場合
              bullet[i].display();//弾を表示
              bullet[i].update();//弾を表示する座標を更新
            }
          }
        }
    //////////////////////////////////////////////////////////
    }
    class MyCharacter{//自機クラス
         int size;//自機の直径
         PVector loc;//自機の位置ベクトル
         PVector op;//自機の操作時のベクトル
         MyCharacter(){
           size=50;
           loc=new PVector(size/2,height/2);
         }
    
         void display(){//自機を表示するメソッド
           fill(0);
           circle(loc.x,loc.y,size);     
         }
    
         void update(){//自機の座標を更新するメソッド
           op= new PVector(0,mouseY-loc.y);//マウスを動かした際のベクトルをopに格納（ｘ座標は固定）
           loc.add(op);//前述のベクトルに合わせて自機を移動
         }
     }
    
    class Bullet{//弾クラス
        PVector loc;//弾の位置ベクトル
        PVector speed;//弾の速度ベクトル
        boolean isDead;//弾の座標が画面内かどうかを判別
        Bullet(){
         loc = new PVector(mc.size,mc.loc.y);
         speed=new PVector(20,0);
         isDead=false;
        }
    
        void display(){//弾を表示するメソッド
          stroke(0);
          line(this.loc.x,mc.loc.y,this.loc.x+20,mc.loc.y);
        }
        void update(){//弾の座標を更新するメソッド
          this.loc.add(speed);//弾の位置ベクトルを変更（弾を移動）
          if(this.loc.x>width){//弾の座標が画面外の場合
            isDead=true;//弾は死亡と判別
            this.loc = new PVector(mc.size,mc.loc.y);//弾の位置ベクトルを初期化
          }
        }
    }
    
    class Enemy{//敵機クラス
          float size;//敵機の直径
          PVector loc;//敵機の位置ベクトル
          float sp;//敵機の速度
          Enemy(){
            size=20;
            loc=new PVector(width+size/2,random(size/2,height-size/2));
            sp=random(5,10);//敵機んお速度をランダムで決定
          }
    
          void display(){//敵機を表示するメソッド
            fill(0);
            circle(loc.x,loc.y,size);
          }
          void update(){ //敵機の座標を更新するメソッド(敵機を移動)
            loc.x-=sp;//敵機のx座標を変更 
            if(loc.x+size/2 < 0){//敵が画面外に出た場合
              loc=new PVector(width+size/2,random(size/2,height-size/2));//敵機の座標を初期化
            }
          } 
    }
    
[/code]


CC BY-SA 4.0
2020-06-06T13:45:45.420
67369
2020-06-07T06:37:26.650
2020-06-07T06:37:26.650
3060
37132
question
java processing
横向きシューティングゲームの弾の動作方法


1 回目のクリックからバグっています。

`mousePressed` は「マウスのボタンが押されている間ずっと true になる」ものであり「マウスのボタンが押されたときの一瞬だけ true
になる」ものではありません。また `draw` 関数は人間の動きに比べるととても早い周期で何回も繰り返し呼ばれています。このため今の実装だと一瞬で 10
発全部発射されています。たとえば `println(bulletCount)` を `draw`
関数の中に仕込んでログを見れば、何かがおかしいと気付けたでしょう。

また `bulletJudge` は一度 true になると永遠に `false`
に戻らないため、一度撃たれた弾が永遠に動き続けています。`bulletCount`
の値によって動けなくなる弾があるため暫くクリックしていると動きがずれてきて、点滅しているように見えるなどします。


CC BY-SA 4.0
2020-06-06T17:14:32.167
67376
2020-06-06T17:14:32.167
19110
67369
answer