Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在控制台应用程序中停止闪烁? 我通过Visual Studio社区(在Windows中)在C++中做了一个简单的乒乓球游戏。我做了,但最终产品一直闪烁,看起来不太好 我是C++新手。这是我尝试做的第一个大项目之一。做了一些研究,我发现我制作了一个控制台应用程序,为了停止闪烁,我必须用图形重新制作我的应用程序,但我不能,所以我正在寻找一种方法来修改我的控制台应用程序以减少闪烁_C++_Windows_Console Application - Fatal编程技术网

如何在控制台应用程序中停止闪烁? 我通过Visual Studio社区(在Windows中)在C++中做了一个简单的乒乓球游戏。我做了,但最终产品一直闪烁,看起来不太好 我是C++新手。这是我尝试做的第一个大项目之一。做了一些研究,我发现我制作了一个控制台应用程序,为了停止闪烁,我必须用图形重新制作我的应用程序,但我不能,所以我正在寻找一种方法来修改我的控制台应用程序以减少闪烁

如何在控制台应用程序中停止闪烁? 我通过Visual Studio社区(在Windows中)在C++中做了一个简单的乒乓球游戏。我做了,但最终产品一直闪烁,看起来不太好 我是C++新手。这是我尝试做的第一个大项目之一。做了一些研究,我发现我制作了一个控制台应用程序,为了停止闪烁,我必须用图形重新制作我的应用程序,但我不能,所以我正在寻找一种方法来修改我的控制台应用程序以减少闪烁,c++,windows,console-application,C++,Windows,Console Application,我的绘图功能-: 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++) {

我的绘图功能-:

 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;
}
void Draw()
{
系统(“cls”);
对于(int i=0;igetX();
int player2x=player2->getX();
int player1y=player1->getY();
int player2y=player2->getY();
如果(j==0)

不能执行代码“删除”移动元素,而不是“系统(“cls”);”,然后在新位置绘制它们。

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

我建议您查看(假设您对仅在windows中工作感到满意),设置光标位置,然后绘制所有内容

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

这不是我测试过的代码,我不知道它是否能与cout一起正常工作。您可能希望替换其他操作,例如“WriteConsole(…)”

注意,使用
cls
将使您的程序仅在Windows上工作。闪烁是由
系统(“cls”)引起的所以我必须在解构器中使用while循环?比如while(!quit){delete player1,player2,ball}?不。这不是关于破坏对象。这是关于移除你放在屏幕上的最后一个球。你可能想看看Win32控制台API。它允许在屏幕上的任意位置输出字符。目标是减少整个屏幕的重新绘制,因此,如果你从屏幕上移除球员和球的旧位置,以及n将它们绘制在新的位置,它将运行得更快,所有闪烁都将消失。如果您确实需要尽可能高效,请保留“之前”和“之后”,并执行差异分析,然后用增量信息修复实际屏幕。这实际上就是NCurses为Unix平台所做的。(不确定是否有Win32控制台的NCurses或类似的东西。可能是,但我不知道。)查看发生了什么的简单方法是注释掉该行并尝试运行它。系统跟踪光标位置。它将绘制的点。当您清除屏幕时,它会将该位置重置为左上角。如果删除该行,它只会在您停止的位置下方绘制所有内容,然后向上滚动。setConsoleCorPosition()告诉它从屏幕左上角开始绘图。第一个参数告诉它是哪个控制台。第二个参数告诉它在哪里(坐标(0,0),这是左上角)如果屏幕在更新之间发生很大变化(例如滚动背景),双缓冲是另一种尝试的技术。我们可以通过
CreateConsoleScreenBuffer
创建两个相同的屏幕缓冲区,并通过
GetConsoleScreenBufferInfoEx
SetConsoleScreenBufferInfoEx
将其调整为与窗口大小完全相同的大小。更新当前未激活的屏幕缓冲区。我们可以通过
WriteConsoleOutput在一次调用中写入整个缓冲区。然后通过
设置控制台活动屏幕缓冲区切换到它。