C++CONSOLEで画面クリアしないで描画ができる!?
昨日ローグライクを作成していた際、デスクトップで試遊しているときには画面クリアは気になりませんでした。しかし、ノートPCで試遊しているとやはり画面クリアが気になるなと思っておりChatGptに相談をしていました。
Q:C++のコンソールで画面クリアをしないで描画上書きはできないよね
A:C++のコンソールアプリケーションでは、通常、画面クリアをせずに描画を上書きすることは難しいです。コンソールウィンドウは通常、テキストベースで動作し、新しいテキストを出力すると古いテキストはその上に追加されることになります。画面をクリアしない限り、以前のテキストが残ります。
画面をクリアするには、Windowsではsystem("cls")、Linux/macOSではsystem("clear")などのシステムコマンドを使用することが一般的です。これにより画面がクリアされ、新しい内容が描画されます。
しかし、完全に画面をクリアせずに一部のテキストを上書きすることは、コンソールアプリケーションの性質上、制約があります。特定の箇所にテキストを上書きする場合、カーソルの移動やカラーリングなどを使って実現する必要がありますが、これはプラットフォームに依存し、比較的複雑な作業になります。
ん?カーソルの移動などを使えば上書きできる?現在の私のヘッダーではバッファーを2つ保持し、前のフレームと異なるときは画面クリアをしてcoutで一気に描画していました。
ChatGptにコードを生成してもらいました。
#include <iostream>
#include <windows.h>
#include <conio.h>
void OverwriteText(int row, int col, const std::string& newText) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// カーソル位置を指定された位置に移動
COORD newPosition = { static_cast<SHORT>(col), static_cast<SHORT>(row) };
SetConsoleCursorPosition(hConsole, newPosition);
// 新しいテキストを出力(古いテキストを上書き)
std::cout << newText;
// カーソルを末尾に移動しないようにする
CONSOLE_CURSOR_INFO cursorInfo;
cursorInfo.dwSize = 1;
cursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(hConsole, &cursorInfo);
}
int main() {
// 古いテキストを描画
std::cout << "古いテキストが表示されています。何かキーを押してください..." << std::endl;
// キー入力を待ち受ける
_getch();
// 画面をクリアせずに新しいテキストを上書き
OverwriteText(0, 0, "新しいテキストが表示されました。 ");
// プログラムを終了
return 0;
}


いや…本当にできるんかい