Делать первый проект и это тетрис;
Сейчас я делаю анимационную часть, но у меня проблема с очисткой экрана, я попробовал:
void clrscr()
{
system("cls");
}
Работало но продолжало мигать экран, есть ли способ использовать gotoxy
функция вместо clrscr
с той же целью?
Я использую консольную систему Windows 32, на Visual Studio 2008.
system("cls")
выполняет команду оболочки для очистки экрана. Это чрезвычайно неэффективно и определенно не для игрового программирования.
К сожалению, экран ввода / вывода зависит от системы. Когда вы ссылаетесь на «cls», а не на «clear», я думаю, вы работаете с консолью Windows:
Если у вас есть функция gotoxy()
Можно расположить одну строку за другой и напечатать много пробелов. Это не ультра производительность, но это подход. это ТАК вопрос обеспечивает gotoxy()
alternatves, так как это нестандартная функция.
это рекомендация поддержки Microsoft предоставляет более эффективную альтернативу для очистки экрана в Windows, используя Консольные функции Winapi такие как GetConsoleScreenBufferInfo()
, FillConsoleOutputCharacter()
а также SetConsoleCursorPosition()
,
Редактировать:
Я понимаю, что вы используете вывод на основе символов, поскольку вы пишете консольное приложение, а не полнофункциональное графическое приложение win32.
Затем вы можете адаптировать приведенный выше код, очистив только часть консоли:
void console_clear_region (int x, int y, int dx, int dy, char clearwith = ' ')
{
HANDLE hc = GetStdHandle(STD_OUTPUT_HANDLE); // get console handle
CONSOLE_SCREEN_BUFFER_INFO csbi; // screen buffer information
DWORD chars_written; // count successful output
GetConsoleScreenBufferInfo(hc, &csbi); // Get screen info & size
GetConsoleScreenBufferInfo(hc, &csbi); // Get current text display attributes
if (x + dx > csbi.dwSize.X) // verify maximum width and height
dx = csbi.dwSize.X - x; // and adjust if necessary
if (y + dy > csbi.dwSize.Y)
dy = csbi.dwSize.Y - y;
for (int j = 0; j < dy; j++) { // loop for the lines
COORD cursor = { x, y+j }; // start filling
// Fill the line part with a char (blank by default)
FillConsoleOutputCharacter(hc, TCHAR(clearwith),
dx, cursor, &chars_written);
// Change text attributes accordingly
FillConsoleOutputAttribute(hc, csbi.wAttributes,
dx, cursor, &chars_written);
}
COORD cursor = { x, y };
SetConsoleCursorPosition(hc, cursor); // set new cursor position
}
Изменить 2:
И, кроме того, вот две функции позиционирования cusor, которые можно смешивать со стандартным выходом cout:
void console_gotoxy(int x, int y)
{
HANDLE hc = GetStdHandle(STD_OUTPUT_HANDLE); // get console handle
COORD cursor = { x, y };
SetConsoleCursorPosition(hc, cursor); // set new cursor position
}
void console_getxy(int& x, int& y)
{
HANDLE hc = GetStdHandle(STD_OUTPUT_HANDLE); // get console handle
CONSOLE_SCREEN_BUFFER_INFO csbi; // screen buffer information
GetConsoleScreenBufferInfo(hc, &csbi); // Get screen info & size
x = csbi.dwCursorPosition.X;
y = csbi.dwCursorPosition.Y;
}