これを説明するのはちょっと難しいですが、最善を尽くします。
グラフィック用のウィンドウで Cmd を使用して rpg(ish) ゲームを作成しています。私は基本的に、壁とプレーヤーを作成し、更新して画面を再描画しているだけです。
私の問題は、「下」キーを押したままにしない限り、動きが完璧に機能することです。短い一時停止の後、プレーヤーは画面の下部に「ジャンプ」します。なぜこれが起こっているのかわからず、問題をコードの狭い部分に絞り込むことができないように見えるので、ここにすべてを示します(まだ多くのコードではありません)。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include<conio.h>
#include<Dos.h>
#include <windows.h>
#define HEIGHT 25
#define WIDTH 80
using namespace std;
void boardLogic();
void renderBoard();
void render();
int seed = 0;
int GameSpeed = 150;
int MovementSpeed = 1500;
bool stopped = false;
bool doneRendering = false;
char board[83][83] = {"###############################################################################",
"#1 #",
"#2 @ #",
"#3 #",
"#4 #",
"#5 #",
"#6 #",
"#7 #",
"#8 #",
"#9 #",
"# #",
"# #",
"# #",
"# #",
"# #",
"# #",
"###############################################################################",
"# #",
"#1 #",
"#2 #",
"#3 #",
"#4 #",
"#5 #",
"###############################################################################",
};
int main()
{
system("Color 3");
while(stopped == false)
{
boardLogic();
system("cls");
render();
Sleep(GameSpeed);
}
}
void renderBoard()
{
srand(seed);
for(int x = 0; x < 24; x++)
{
cout << board[x];
for(int y = 0; y < 84; y++)
{
if(board[x][y] == '#') board[x][y] = 219;
}
cout << endl;
}
}
void boardLogic()
{
for(int x = 0; x < 24; x++)
{
for(int y = 0; y < 84; y++)
{
if(board[x][y] == '#') board[x][y] = 219;
if(board[x][y] == '@' && doneRendering == true)
{
if(GetAsyncKeyState(VK_UP) != 0)
{
if(board[x-1][y] == ' ')
{
board[x-1][y] = '@';
board[x][y] = ' ';
break;
}
Sleep(MovementSpeed);
break;
}
if(GetAsyncKeyState(VK_RIGHT) != 0)
{
if(board[x][y+1] == ' ')
{
board[x][y+1] = '@';
board[x][y] = ' ';
break;
}
Sleep(MovementSpeed);
break;
}
if(GetAsyncKeyState(VK_LEFT) != 0)
{
if(board[x][y-1] == ' ')
{
board[x][y-1] = '@';
board[x][y] = ' ';
break;
}
Sleep(MovementSpeed);
break;
}
if(GetAsyncKeyState(VK_DOWN) != 0)
{
if(board[x+1][y] == ' ')
{
board[x+1][y] = '@';
board[x][y] = ' ';
break;
}
Sleep(MovementSpeed);
break;
}
}
}
}
}
void render()
{
doneRendering = false;
renderBoard();
doneRendering = true;
}