# 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», была спроектирована как одномерный массив символов.
Но большая проблема заключается в том, что если длина строки превышает 80, то консоль просто отображает 80 символов в одной строке независимо от размера окна консоли.
Я имею в виду, например, строка ввода
char 1D_map[90] = {'D'};
и размер окна консоли составляет 5 * 20.
Тогда, независимо от размера окна, оно показывается как сзади.
DDDDD (.. левые 70 символов скрыты ..)
DDDDD (.. левые 5 символов скрыты ..)
Когда я потяну боковую панель окна на максимум, она будет выглядеть как сзади.
DDDDDDDDDDDDDDDD … 80 символов … DDDDDDDDDDDDDDDDD
DDDDDDDDDD
Поэтому, когда я использую эти коды, я не могу настроить размер игровой карты.
(Конкретно горизонтальный размер.)
Потому что, что бы я ни делал, это просто показывает 80 символов в строке!
Могу ли я решить проблему? или я должен применить другой метод двойной буферизации?
Задача ещё не решена.
Других решений пока нет …