Я пишу небольшую консольную приключенческую игру и столкнулся с несколькими проблемами.
1. Ввод немного запаздывает, я использую цикл while (while (getch () == 'w')). После первого нажатия клавиши ничего не происходит (вы должны нажать ее 2 раза), и если вы меняете направление (нажмите кнопку A / D / S), она также не реагирует в первый раз. Если вы держите клавишу, она работает нормально. Как это можно исправить?
2. Вот функция, которую я использую для обновления игры (рендеринг игровой сцены при нажатии клавиши):
void refresh(char map[Y][X])
{
system("cls");
for (int i = 0; i<UP; i++)
{
cout<<endl;
}
for (int i = 0; i<Y; i++)
{
for (int k = 0; k<LEFT; k++)
{
cout<<" ";
}
for (int j = 0; j<X; j++)
{
cout<<map[i][j];
}
cout<<endl;
}
}
Когда я использую эту функцию один раз, это нормально, но когда они нажимаются или удерживаются несколько раз - игровое поле начинает мигать. Я понял, что мне нужно перерисовать только часть поля (где сделаны изменения / сделаны движения), а не все поле. Можете ли вы предложить какие-либо идеи, как это сделать?
Пример кода для ввода:
while(getch() == 'w')
{
if (map[y-1][x]!= WALL)
{
map[y-1][x] = CHARACTER;
map [y][x] = ' ';
y--;
refresh(map);
Sleep(SPEED); // this is unnecessary, SPEED is 0, I just kept it for tests
}
}
По сути, основная функция выглядит так:
int main()
{
(...) Variables (...)
generateMap(FROM FILE);
refresh(); // First initialization of the field
while (getch() != 'q') // While not quitting
{
while(getch() == 'w')
{
if (THE FIELD ABOVE IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 's')
{
if (THE FIELD BELOW IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 'a')
{
if (THE FIELD ON THE LEFT IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
while(getch() == 'd')
{
if (THE FIELD ON THE RIGHT IS NOT OCCUPIED)
{
setSomeVariables();
refresh(THE GAMEFIELD);
}
}
}
return 0;
}