所以这有点难以解释,但我会尽我所能。
我正在使用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;
}
答案 0 :(得分:0)
下行事件的逻辑与其他事件的逻辑不同,您是否尝试过更改它以使其类似于例如?即删除要渲染的调用。
答案 1 :(得分:-2)
我通过使用switch语句而不是&#34;如果&#34; s解决了我的问题。我不知道为什么会这样,但事实上确实很有效。