如何停止控制台应用程序中的闪烁?

时间:2019-02-12 13:36:26

标签: c++ windows console-application

我通过Visual Studio社区(在Windows中)用c ++制作了一个简单的乒乓游戏。我做到了,但是最终产品一直闪烁,而且看起来也不好。

我是C ++的新手。这是我尝试进行的首批大型项目之一。做一些研究,我发现自己制作了一个控制台应用程序,并且要停止闪烁,我将不得不在Graphics中重新制作我的应用程序,但是我做不到,所以我正在寻找一种方法来修改控制台应用程序以减少闪烁。

我的绘画功能-:

 void Draw()
{
    system("cls");
    for (int i = 0; i < width + 2; i++)
        cout << "\xB2";
    cout << endl;

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            int ballx = ball->getX();
            int bally = ball->getY();
            int player1x = player1->getX();
            int player2x = player2->getX();
            int player1y = player1->getY();
            int player2y = player2->getY();

            if (j == 0)
                cout << "\xB2";

            if (ballx == j && bally == i)
                cout << "O";//ball
            else if (player1x == j && player1y == i)
                cout << "\xDB";//player1_segment0
            else if (player2x == j && player2y == i)
                cout << "\xDB";//player2_segment0
            /*Prints different segments of player1 in y-dir*/
            else if (player1x == j && player1y + 1 == i)
                cout << "\xDB";//player1_segment1
            else if (player1x == j && player1y + 2 == i)
                cout << "\xDB";//player1_segment2
            else if (player1x == j && player1y + 3 == i)
                cout << "\xDB";//player1_segment3
            /*Prints different segments of player2 in y-dir*/
            else if (player2x == j && player2y + 1 == i)
                cout << "\xDB";//player2_segment1
            else if (player2x == j && player2y + 2 == i)
                cout << "\xDB";//player2_segment2
            else if (player2x == j && player2y + 3 == i)
                cout << "\xDB";//player2_segment3

            else
                cout << " ";

            if (j == width - 1)
                cout << "\xB2";
        }
        cout << endl;
    }

    for (int i = 0; i < width + 2; i++)
        cout << "\xB2";
    cout << endl;
    cout << "Score 1: " << score1 << endl;
    cout << "Score 2: " << score2 << endl;
}

谢谢。

This is what it looks like without flickers

2 个答案:

答案 0 :(得分:1)

代替'system(“ cls”);'实施代码以“删除”运动元素,然后将其绘制到新位置。

答案 1 :(得分:1)

在开始绘制之前,清除屏幕会使整个屏幕变黑,从而导致闪烁。

我建议您研究Windows Console API(假设您很高兴仅在Windows中可以使用此功能)。设置光标位置,然后绘制所有内容。

COORD coord;
coord.X = 0;
coord.Y = 0;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

这不是我测试过的代码,我不知道它是否可以在cout中正常工作。您可能需要替换一下其他操作,例如“ WriteConsole(...)”