0

宇宙船が他の敵に弾丸を発射する ncurses ゲームを作成しています。弾丸を発射する船を持っていますが、複数の弾丸を発射すると、最新の弾丸だけが動き、残りは静止したままになります。

int i=0 , j=-1;
switch(key){ 
    case KEY_UP: playership.row=changeRow(playership.row,-1,playership.col); /* move up */ 
    break; 
    case KEY_DOWN: playership.row=changeRow(playership.row,+1,playership.col); /* move down */ 
    break; 
    case KEY_LEFT:playership.col=changeColumn(playership.col,-1,playership.row); /* move left */ 
    break; 
    case KEY_RIGHT:playership.col=changeColumn(playership.col,+1,playership.row); /* move right */ 
    break; 
    case ' ': {j++; bullets[0].col=playership.col+5; bullets[j].row=playership.row-2 ;break;}
    default: break; /* do nothing if other keys */ 

    }
 if (j!=-1){
     attrset(COLOR_PAIR(2));
     mvprintw(bullets[j].row,bullets[0].col,"%c",bullet);
     mvprintw(bullets[j].row+1,bullets[0].col," ");
     bullets[j].row=bullets[j].row-1;
     refresh();
 }

以前の質問に対するこの回答のコメントからの提案を実装しようとしましたが、正しく行ったとは思いません:

一度に 5 つの弾丸を持つことができる場合は、それらの位置を保存する必要があります。int bullet_pos[5] があれば問題ありません。各位置で -1 を使用して、アクティブな弾丸がないことを示すことができます。次に、弾丸を発射する場合は、配列を検索して最初の -1 の位置を見つけ、それを 0 に変更します。弾丸を描画するときは、配列を調べて、-1 以外の任意の位置に弾丸を描画します。そしてその位置を更新します。

4

1 に答える 1

0

まだ行っていない場合は、箇条書き構造にフラグを追加してみてください。のようなものalive

発砲したい場合は、配列をチェックして、未使用の弾丸の位置を見つけます (存在する場合):

for( int i = 0; i < MAX_BULLETS; i++ ) {
    if( !bullets[i].alive ) {
        bullets[i].alive = true;
        bullets[i].row = playership.row;
        bullets[i].col = playership.col+5;
        break;
    }
}

次に、更新または描画すると:

for( int i = 0; i < MAX_BULLETS; i++ ) {
    if( bullets[i].alive ) {
        attrset(COLOR_PAIR(2));
        mvprintw(bullets[i].row, bullets[i].col, "%c", bullet);
        mvprintw(bullets[i].row+1, bullets[i].col, " " );
        bullets[i].col++;

        // TODO check for bullet death.  If bullet is done, set `alive` to false.
    }
}

refresh();
于 2013-11-06T03:10:17.567 に答える