52992


shot_controlクラスのUpdate()の部分のあたりなのですがなぜ弾が一発しか発射されないのでしょうか？配列の要素もDraw()関数部で回してるのですが原因がわからないのですが原因も知りたいので質問しました設計の仕方自体に問題があればそれも教えてくれますでしょうか？

[code]

    #include "DxLib.h"
    #include "math.h"
    #include <string>
    using namespace std;
    
    static int key[256];
    static int Color = GetColor(255, 255, 255);
    int KeyBord_Get(int keycode)
    {
    
        char tmpkey[256];
        GetHitKeyStateAll(tmpkey);
        for (int i = 0; i < 256; i++)
        {
            if (tmpkey[i] != 0)
            {
                key[i]++;
            }
            else
            {
                key[i] = 0;
            }
    
        }
    
        return key[keycode];
    }
    
    //--------------ショット攻撃
    class Shot_Control
    {
    private:
    
        typedef struct
        {
            int x;
            int y;
            int width;
            int height;
            int shot_gh;
    
            int flag = false;
    
        }shot;
    
    
        int shot_flag = false;
        int count = 0;
        shot gh[40];
    
    public:
        int start_x;
        int start_y;
        void Draw()
        {
            for (int i = 0; i < 40; i++)
            {
                DrawGraph(gh[i].x, gh[i].y, gh[i].shot_gh, true);
    
            }
        }
    
        void Move()
        {
    
    
            for (int i = 0; i < 45; i++)
            {
                if (gh[i].flag == false)
                {
                    gh[i].x = start_x;
                    gh[i].y = start_y;
                }
                if(gh[i].flag == true)
                {
                    gh[i].y -= 4;
                }
    
            }
    
            if (shot_flag == true)
            {
                for (int i = 0; i < 45; i++)
                {
                    gh[i].flag = true;
                }
            }
    
    
        }
    
        void Finalize()
        {
    
            for (int i = 0; i < 40; i++)
            {
                if (gh[i].y < -10)
                {
                    gh[i].flag = false;
                }
            }
    
        }
    
        void Update(int xx,int yy)
        {
            start_x = xx;
            start_y = yy;
    
            if (key[KEY_INPUT_Z] >= 1)
            {
                if (count % 6 == 0)
                {
                    shot_flag = true;
                }
                else
                {
                    shot_flag = false;
                }
            }
    
    
            DrawFormatString(0, 10, Color, "flag: %d", shot_flag);
    
            DrawFormatString(0,0,Color,"x: %d , y: %d",start_x,start_y);
    
            Move();
            count++;
    
        }
        void Initialize(const char *str,int w, int h)
        {
    
            for (int i = 0; i < 40; i++)
            {
                gh[i].shot_gh = LoadGraph(str);
                //gh[i].x = xx;
                //gh[i].y = yy;
                gh[i].width = w;
                gh[i].height = h;
                gh[i].flag = false;
            }
    
        }
    };
    
    //------------------プレイヤークラス
    class Player_Control
    {
    
    private:
    
        int gh;
    
    
        int width;
        int height;
    
        bool flag;
    
    
    public:
        int x;
        int y;
        Player_Control()
        {
    
        }
    
        void Draw()
        {
            DrawGraph(x,y,gh,true);
            //DrawGraph(x,y - 3,gh,true);
    
    
        }
    
        void Update()
        {
    
            if (KeyBord_Get(KEY_INPUT_UP) >= 1)
            {
                y = y - 2;
            }
            if (KeyBord_Get(KEY_INPUT_RIGHT) >= 1)
            {
                x = x + 2;
            }
            if (KeyBord_Get(KEY_INPUT_LEFT) >= 1)
            {
                x = x - 2;
            }
            if (KeyBord_Get(KEY_INPUT_DOWN) >= 1)
            {
                y = y + 2;
            }
    
            if (KeyBord_Get(KEY_INPUT_Z) >= 1)
            {
    
    
            }
    
    
        }
    
        void Initialize()
        {
            gh = LoadGraph("resources/Player.png");
            //DrawFormatString(0,0,Color,"aaaaa");
            x = 200;
            y = 200;
    
            width = 45;
            height = 45;
    
        }
    
    };
    
    Player_Control player;
    Shot_Control player_shot;
    
    //初期化
    void Game_Initialize()
    {
        player_shot.Initialize("resources/Player_Shot.png",14,3);
        player.Initialize();
    }
    //計算
    void Game_Update()
    {
        player.Update();
        player_shot.Update(player.x,player.y);
    }
    //描画
    void Game_Draw()
    {
        player.Draw();
        player_shot.Draw();
    }
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
        ChangeWindowMode(TRUE); 
        if (DxLib_Init() == -1) { return -1; }  
    
    
        Game_Initialize();
        while (ClearDrawScreen() == 0 && SetDrawScreen(DX_SCREEN_BACK) == 0 && ProcessMessage() == 0)
        { 
    
            Game_Update();
    
            Game_Draw();
    
            ScreenFlip();                   
            if (CheckHitKey(KEY_INPUT_ESCAPE) == 1) { break; }  
        }   
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-02-23T04:44:09.323
52963
2019-02-25T01:11:41.430
2019-02-25T01:11:41.430
2238
question
c++
dxlib シューティングで自機から弾を無限に発射するプログラムで一発しかでない原因が知りたい。


Shot_Controlがぐちゃぐちゃになってやりたいことができてない感じですね。

今の状態だと、ほかにも不具合がいっぱいありますが、以下が原因です。

  1. shot_flagがtrueになる
  2. 全てのgh[i].flagがtrueになる
  3. 結果40個すべてのshotが同時に発射される。

以下余談

・Zキーが押されたかどうかはGame_Update直下で確認し、Shot_ControlのUpdateにTriggerdとして渡しましょう。  
・ShotクラスとShot_Control（Weapon）クラスを完全に分けましょう。  
・Shot_ControlはShotクラスのUpdateやDrawはしません。  
・Shot_Controlクラスは、Shotを新しく打てるか、どのshotを使用して再配置するかだけします。  
・Shot_ControlクラスのDrawは空です。  
・Shotクラスが不要になるかは（画面外など）は、Shotクラス自身がUpdate内で判断・保持しましょう  
・つまり  
生成や再配置は自分自身以外がする  
死んだかどうかはオブジェクト自身が判断する  
自分死んでますよーオブジェクトは、Game_ExistsOrDestroyでゲームループから取り除く  
・Game_Update直下にShot配列をUpdateするようにしましょう  
・本音を言えば、Game_Updateを細分化することが推奨されます。  
・Game_Move（移動や弾の発射要求かどうかなど処理する）  
・Game_Collides（Move後のヒット判定全てを行う。）  
・Game_GetCreatedUnits（発射弾や破壊エフェクトを各オブジェクトから取得）  
・Game_ExistsOrDestroy（必要のないオブジェクトをゲームループから取り除く）  
・Game_AddCreatedUnits（GetCreatedUnitsで取得した内容をゲームループ内に追加する）


CC BY-SA 4.0
2019-02-24T09:57:55.173
52992
2019-02-24T09:57:55.173
25396
52963
answer