c++ - para - cómo usar la función gotoxy en lugar de clrscr
libreria para gotoxy codeblocks (1)
system("cls")
ejecuta un comando de shell para borrar la pantalla. Esto es tremendamente ineficiente y definitivamente no para la programación de juegos.
Lamentablemente, la E / S de pantalla depende del sistema. Cuando te refieres a "cls" y no a "borrar", supongo que estás trabajando con la consola de Windows:
Si tiene una función
gotoxy()
, es posible posicionarse en una línea después de la otra e imprimir muchos espacios. No es ultra eficiente, pero es un enfoque. Esta pregunta SO proporcionagotoxy()
alternatves, ya que es una función no estándar.Esta recomendación de soporte de Microsoft proporciona una alternativa más efectiva para borrar la pantalla en Windows, usando las funciones de la consola
GetConsoleScreenBufferInfo()
comoGetConsoleScreenBufferInfo()
,FillConsoleOutputCharacter()
ySetConsoleCursorPosition()
.
Editar:
Entiendo que use salida basada en caracteres, al escribir una aplicación de consola y no una aplicación gráfica win32 con todas las funciones.
A continuación, puede adaptar el código proporcionado anteriormente, borrando solo una parte de la consola:
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
}
Editar 2:
Y, además, aquí hay dos funciones de posicionamiento de cusor que puedes mezclar con salida estándar de 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;
}
Hacer el primer proyecto y es tetris; Ahora estoy haciendo la parte de la animación, pero tengo un problema para limpiar la pantalla, lo he intentado:
void clrscr()
{
system("cls");
}
Funcionó, pero siguió parpadeando en la pantalla, ¿hay alguna manera de usar la función gotoxy
lugar de clrscr
el mismo propósito?
Estoy usando el sistema de consola de Windows 32, en Visual Studio 2008.