1

私は ncurses を初めて使用し、選択したゲームを作成するプロジェクトを持っています。私のゲームのアイデアは、宇宙船を持ち、敵を上から攻撃させることです。コードを開始しただけで、すでに問題に遭遇しました。スペースバーを使用して弾丸を撃つと、弾丸は移動しますが、弾丸が移動しているときに船を動かすことができません。

#include<ncurses.h>

typedef struct
{/*define a structure for player information*/
    int row;
    int col;
}playerinfo;

int changeRow(int x,int m, int c)
{
    if(x+m==22 || x+m==0  )
    {
        beep();
        return x;
    }
    return x+m;
}
int changeColumn(int y,int n, int r)
{
    if(y+n==72 || y+n==0  )
    {   
        beep();
        return y;
    }
    return y+n;
}

int main(){
    initscr();              

    start_color();  
    assume_default_colors(COLOR_GREEN, COLOR_BLACK); 

    noecho();
    cbreak();                       

    curs_set(0); /* turn cursor display off */

    timeout(0); 

    keypad(stdscr,TRUE);  /* allow keypad keys to be used */            
    playerinfo playership;

    playership.row= 10;
    playership.col= 15;

    char player[] ="     X     ";
    char player2[]="    |o|    ";
    char player3[]="  xX| |Xx  ";
    char player4[]="  X | | X  ";
    char player5[]=" X__-|-__X ";

    char bullet = '.';

    int key = 0;
    int i=0;
    bool moving= false;
    mvprintw(playership.row,playership.col,player);
    mvprintw(playership.row+1,playership.col,player2);
    mvprintw(playership.row+2,playership.col,player3);
    mvprintw(playership.row+3,playership.col,player4);
    mvprintw(playership.row+4,playership.col,player5);
    timeout(0);

    while(key!='q'){ 
        usleep(17000);

    mvprintw(playership.row,playership.col,"         ");
    mvprintw(playership.row+5,playership.col,"          ");

    key = getch (); 

    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 ' ': moving=true; break;
            default: break; /* do nothing if other keys */ 
    }

    mvprintw(playership.row,playership.col,player);
    mvprintw(playership.row+1,playership.col,player2);
    mvprintw(playership.row+2,playership.col,player3);
    mvprintw(playership.row+3,playership.col,player4);
    mvprintw(playership.row+4,playership.col,player5);

    if (moving==true){
        for( i=0; i <24; i++){ 
            refresh; mvprintw(playership.row-i-2,playership.col+5,"%c", bullet); mvprintw(playership.row,playership.col,player); 
            refresh();usleep(12000); mvprintw(playership.row-i-1,playership.col+5," ");} moving=false; }
            refresh(); 
        }


    echo();   /* turn echo back on */

    endwin(); /* End curses mode */

    return 0;
} 
4

1 に答える 1

2

これは、ゲーム ループ内に「起動」コードをネストしたためです。そのため、アニメーションを実行している間、すべての入力が停止します。ロジックを一種のステート マシンに変更する必要があります。

    switch(key)
    {
    // ...
    case ' ':
        if( !bullet_active )
        {
            bullet_active = true;
            bullet_pos = 0;
        }
        break;
    }

    if( bullet_active ) {
        // TODO: Draw bullet at bullet_pos

        if( ++bullet_pos == 24 ) bullet_active = false;
    }
于 2013-11-05T03:30:11.153 に答える