игра не работает ncurses

Я делаю игру 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, и обновите
его позиция.

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();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector