как использовать функцию gotoxy вместо clrscr

Делать первый проект и это тетрис;
Сейчас я делаю анимационную часть, но у меня проблема с очисткой экрана, я попробовал:

void clrscr()
{
system("cls");
}

Работало но продолжало мигать экран, есть ли способ использовать gotoxy функция вместо clrscr с той же целью?

Я использую консольную систему Windows 32, на Visual Studio 2008.

1

Решение

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;
}
3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector