所以这有点难以解释,但我会尽力而为。
我正在使用 Windows 上的 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;
}