最初のプロジェクトをやっていて、それはテトリスです。今、私はアニメーションの部分をやっていますが、画面をクリアするのに問題があります.
void clrscr()
{
system("cls");
}
機能しましたが、画面が点滅し続けました。同じ目的gotoxy
の代わりに関数を使用する方法はありますか?clrscr
Visual Studio 2008 で Windows コンソール システム 32 を使用しています。
system("cls")
シェルコマンドを実行して画面をクリアします。これは非常に非効率的であり、ゲーム プログラミングには絶対に適していません。
残念ながら、画面 I/O はシステムに依存します。「クリア」ではなく「cls」を参照しているため、Windowsコンソールで作業していると思います。
function がある場合gotoxy()
、1 行ずつ配置して多くのスペースを印刷することができます。超高性能ではありませんが、アプローチです。このSO の質問gotoxy()
は、非標準の機能であるため、代替手段を提供し ます。
このMicrosoft サポートの推奨事項は、 、 、 などのwinapi コンソール機能を使用して、Windows で画面をクリアするためのよりパフォーマンスの高い代替手段を提供します。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:
さらに、標準の cout 出力と組み合わせることができる 2 つの cusor ポジショニング関数を次に示します。
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;
}