1

最初のプロジェクトをやっていて、それはテトリスです。今、私はアニメーションの部分をやっていますが、画面をクリアするのに問題があります.

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

機能しましたが、画面が点滅し続けました。同じ目的gotoxyの代わりに関数を使用する方法はありますか?clrscr

Visual Studio 2008 で Windows コンソール システム 32 を使用しています。

4

1 に答える 1

3

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;
}  
于 2015-04-18T19:29:12.377 に答える