89934


C言語とncursesを用いてシューティングゲームを作りたいのですが入力された方向への自機の移動と発射した弾の移動を同時に行う方法がわかりません。

自機の移動と弾の発射そのものは可能なのですが発射された弾が画面上部で消滅するまでの間自機の操作ができなくなります。GameMainのWhile文内でShootBulletが実行されると弾が消滅するまで操作不可となるいわゆる逐次処理の構造をとってしまっていることが原因であることは理解しています。

そこでMoveBullet関数が呼び出される度に弾を1マスだけ移動させることも考えましたが(いろいろ試しているとごちゃごちゃしてしまったので下のソースコードはそれらの修正を試す前の状態のものです)、そうすると今度はgetchが邪魔をして弾を上手く移動させられなくなります。

どなたか改善方法がわかる方がいましたらアドバイスしてもらえると助かります。  
まだまだ未完成のものなので不自然な点も多いと思いますが下に記述しているものが自力で途中まで作成したソースコードです。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <locale.h>
    #include <ncurses.h>
    #include <windows.h>
    
    struct Player{
    int x;
    int y;
    int hp;
    };
    
    struct Enemy{
    int x;
    int y;
    int hp;
    };
    
    void PrintPlayer(int x, int y){
    struct Player player;
    char *you = "△";
    player.x = x;
    player.y = y;
    mvprintw(y, x, "%s", you);
    refresh();
    }
    
    void CreateEnemy(int x, int y, int type){
    struct Enemy enemy;
    char *target = "▼";
    enemy.x = x;
    enemy.y = y;
    if(type == 1){
    enemy.hp = 5;
    }else if(type == 2){
    enemy.hp = 50;
    }
    mvprintw(y, x, "%s", target);
    refresh();
    }
    
    void MoveBullet(int x, int y, char *bullet){
    while(y != 2){
    mvprintw(y, x, "　");
    y--;
    mvprintw(y, x, "%s", bullet);
    refresh();
    Sleep(100);
    }
    mvprintw(y, x, "　");
    }
    
    void ShootBullet(int x, int y){
    char *bullet ="◎";
    mvprintw(y, x, "%s", bullet);
    refresh();
    MoveBullet(x, y, bullet);
    }
    
    void GameMain(int x, int y1, int y2, int wideL, int wideR){
    int input;
    
    keypad(stdscr, TRUE);
    noecho();
    PrintPlayer(x, y1);
    CreateEnemy(58, y2, 1);
    input = getch();
    while(input != 'q'){
        if(input == KEY_RIGHT && x != wideR - 3){
            x++;
        }else if(input == KEY_LEFT && x != wideL + 1){
            x--;
        }else if(input == KEY_UP){
            ShootBullet(x, y1 - 1);
        }
        PrintPlayer(x, y1);
        input = getch();
        
    }
    
[/code]


CC BY-SA 4.0
2022-07-09T21:37:14.823
89875
2022-07-15T01:33:05.650
2022-07-15T01:33:05.650
3060
53463
question
c game-development
シューティングにおける弾と自機の移動を同時に行う方法


このような場合、ループは関数内で移動終了までループするのではなくて、移動中というフラグと速度を変数に保存しておいて、毎回、自機・敵・弾の全てに対して1ステップ分だけ状態を更新するような作りにしますし、自機・敵・弾の構造体は関数内でローカル変数として作るんじゃなくてmallocしたものの中味を変更していくことが多いと思います。

「Curses ゲーム」などで探してソースを眺めて大まかな設計方針を真似るといいんじゃないでしょうか。  
<https://aki-yam.hatenablog.com/entry/20090402/1238674450>  
<https://qiita.com/pokohide/items/a246045f3ccaf540a375>  
<https://github.com/itsukiss/shooting-game>


CC BY-SA 4.0
2022-07-12T13:18:32.780
89934
2022-07-12T13:18:32.780
241
89875
answer