# 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个字符!!
我可以解决这个问题吗?或者我应该采用其他双缓冲方法吗?