我正在制作一个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();
}
我尝试在this answer to my earlier question的评论中实施建议,但我认为我做得不对:
如果你可以同时拥有5发子弹,你需要存储他们的位置。 如果你有int bullet_pos [5]那就没问题。你可以使用-1 in 每个位置都说没有子弹是活跃的。然后当你想要 触发一个搜索数组以找到-1的第一个位置 并将其更改为0.当你绘制子弹时,你会经历 数组并为任何非-1的位置绘制子弹,并更新 它的位置。
答案 0 :(得分: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();