基于文本的图形无法正确更新

时间:2013-08-12 05:42:14

标签: c++

所以这有点难以解释,但我会尽我所能。

我正在使用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;
}

2 个答案:

答案 0 :(得分:0)

下行事件的逻辑与其他事件的逻辑不同,您是否尝试过更改它以使其类似于例如?即删除要渲染的调用。

答案 1 :(得分:-2)

我通过使用switch语句而不是&#34;如果&#34; s解决了我的问题。我不知道为什么会这样,但事实上确实很有效。