C ++控制台应用程序使用双缓冲区大小限制

时间:2017-08-20 09:36:28

标签: c++ console-application double-buffering

# include "DISPLAY.h"


DoubleBuffer::DoubleBuffer()
{
    COORD size = { WINDOW_X_SIZE , WINDOW_Y_SIZE };
    SMALL_RECT rect;
    rect.Left = 0;
    rect.Right = WINDOW_X_SIZE - 1;
    rect.Top = 0;
    rect.Bottom = WINDOW_Y_SIZE - 1;

    hBuffer[0] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleScreenBufferSize(hBuffer[0], size);
    SetConsoleWindowInfo(hBuffer[0], TRUE, &rect);

    hBuffer[1] = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
    SetConsoleScreenBufferSize(hBuffer[1], size);
    SetConsoleWindowInfo(hBuffer[1], TRUE, &rect);

    CONSOLE_CURSOR_INFO cursorinfo;
    cursorinfo.dwSize = 1;
    cursorinfo.bVisible = FALSE;

    SetConsoleCursorInfo(hBuffer[0], &cursorinfo);
    SetConsoleCursorInfo(hBuffer[1], &cursorinfo);

    nBufferIndex = 0;
}

void DoubleBuffer::WriteBuffer(int x, int y, char *string)
{
    DWORD dw;
    COORD startposition = { x,y };

    SetConsoleCursorPosition(hBuffer[nBufferIndex], startposition);
    WriteFile(hBuffer[nBufferIndex], string, strlen(string), &dw, NULL);
}

void DoubleBuffer::FlippBuffer()
{
    Sleep(1000);
    SetConsoleActiveScreenBuffer(hBuffer[nBufferIndex]);
    nBufferIndex = !nBufferIndex;
}

void DoubleBuffer::ClearBuffer()
{
    COORD coord = { 0,0 };
    DWORD dw;
    FillConsoleOutputCharacter(hBuffer[nBufferIndex], ' ', WINDOW_X_SIZE*WINDOW_Y_SIZE, coord, &dw);
}

void DoubleBuffer::ReleaseBuffer()
{
    CloseHandle(hBuffer[0]);
    CloseHandle(hBuffer[1]);
}

我用这段代码构造了一个双缓冲区。

将在函数'WriteBuffer'上打印的整个游戏地图设计为1D字符数组。

但是一个很大的问题是,如果字符串的长度超过80,那么无论控制台窗口大小如何,控制台都只在一行中显示80个字符。

我的意思是,例如输入字符串是

    char 1D_map[90] = {'D'};

,控制台窗口大小为5 * 20.

然后无论窗口大小是什么,它都显示在后面。

DDDDD(..左侧70个字符被隐藏..)

DDDDD(......左边5个字符被隐藏..)

当我将窗户的侧边拉到最大值时,它就像在后面一样。

DDDDDDDDDDDDDDD ... 80个字符... DDDDDDDDDDDDDDDD

DDDDDDDDDD

所以当我使用这些代码时,我无法调整游戏地图的大小。 (具体地说是水平尺寸。)

因为无论我做什么,它只会在一行中显示80个字符!!

我可以解决这个问题吗?或者我应该采用其他双缓冲方法吗?

0 个答案:

没有答案