Dxlibの表示された文字の消し方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Yuki_256

Dxlibの表示された文字の消し方

#1

投稿記事 by Yuki_256 » 1年前

最近Dxlibでゲームを作っているのですが、「最初にある文字を表示させた後、2秒後に新しい文字を表示して最初に表示させた文字は消す」という操作か「ある文字を表示させた後、エンターキーが押されたら新しい文字を表示して最初に表示させた文字は消す」という操作のどちらかを作りたいと思っています。
ですが、まだDxlibを触り始めたばかりなのでどうすれば良いのかよく分かりません。
作り方やサンプルコードなどを教えてくだされば幸いです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Dxlibの表示された文字の消し方

#2

投稿記事 by みけCAT » 1年前

どのような処理に組み込むかによってもいい書き方は変わってくると思いますが、例えばこのような感じでできます。

コード:

#include <DxLib.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	if (ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK) return 1;
	if (DxLib_Init() == -1) return 1;
	SetDrawScreen(DX_SCREEN_BACK);

	int startTime = GetNowCount(); // 最初の時刻
	bool enterPressed = false; // Enterキーが押されたか

	int color = GetColor(255, 255, 255);
	while (ProcessMessage() == 0 && ScreenFlip() == 0 && ClearDrawScreen() == 0) {
		if (GetNowCount() - startTime < 2000) {
			// まだ2秒経っていない
			DrawString(50, 50, "ある文字", color);
		} else {
			// 2秒経った
			DrawString(50, 80, "新しい文字", color);
		}
		// Enterキーが押されたかをチェックする
		if (CheckHitKey(KEY_INPUT_RETURN)) enterPressed = true;
		if (enterPressed) {
			// Enterキーが押された
			DrawString(50, 280, "新しい文字", color);
		} else{
			// Enterキーが押されていない
			DrawString(50, 250, "ある文字", color);
		}
	}
	DxLib_End();
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Yuki_256

Re: Dxlibの表示された文字の消し方

#3

投稿記事 by Yuki_256 » 1年前

すみません。説明が抽象的すぎました!
というより日本語がおかしかったです。
下のコードを参考にすると、

コード:

int Key[256]; 

int UpdateKey() { //押されたキーを判定する

	char tmpKey[256]{};

	GetHitKeyStateAll(tmpKey);

	for (int i = 0; i < 256; i++) {

		if (tmpKey[i] != 0) {
			Key[i]++;
		}
		else {
			Key[i] = 0;
		}
	}
	return 0;
}


int FileHandle;
char String[50][100]{}; //[最大の行数][1行あたりの最大文字数]

//textファイルを用意する関数
void Text_File() {


	//textファイルを開く
	FileHandle = FileRead_open("テキスト.txt");

	for (int i = 0; i < 49; i++) {

		FileRead_gets(String[i], 256, FileHandle);
	}

	FileRead_close(FileHandle);

}

int DrawWidth;
bool EnterPressed = false;

int Text(int x) {
	
	
	
		if (Key[KEY_INPUT_RETURN] == 1) { //キーが押されたらtrueにする

			EnterPressed = true;

		}

		
		if (EnterPressed) { //EnterPressed == trueなら

			DrawWidth = GetDrawStringWidth(String[0], -1); 
			DrawString((640 - DrawWidth) / 2, 220, String[0], GetColor(255, 255, 255)); //文字を消す(ファイル内の0行目は空白)
		}
		else { 
			DrawWidth = GetDrawStringWidth(String[x], -1); //文字を中央揃えにする
			DrawString((640 - DrawWidth) / 2, 220, String[x], GetColor(255, 255, 255)); //xの値によって表示させる行数を変える

		}
			
		

	return x;
}



int WINAPI WinMain(_In_ HINSTANCE hinstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR lpCmdLine,_In_ int nShiwCmd)
{
	ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK);
	

	while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0){

		Text_File(); //txtファイルを読み込む	  
		
                Text(1); //txtファイルの1行目を表示する
		Text(2); //txtファイルの2行目を表示する
}
	
	DxLib_End();

	return 0;
}
		
本来はText(1)を先に動かして、その後にText(2)を動かしたかったのですが、最初からText(1),Text(2)の両方が動いてしまって文字が重なってしまいます。
この原因は文字を消す部分のプログラムに問題があるのかと思い、質問しました。
このコードを参考にしていただき、さらに改善案を出していただければ幸いです。
まだ少し日本語が怪しい部分がありますが、すみません。

アバター
usao
記事: 1887
登録日時: 11年前

Re: Dxlibの表示された文字の消し方

#4

投稿記事 by usao » 1年前

コード:

Text(1); //txtファイルの1行目を表示する
Text(2); //txtファイルの2行目を表示する
って2つ書いたら → 両方が表示される

というのは極めて自然で当たり前すぎる話だと思える.
(むしろ,「頑張って2つ書いたのに何故か1個しか表示されない」とかなったら困るじゃん?)

そしたら,1個にしたいなら1個だけ書けばいいんじゃない? っていうのも極めて明瞭な事柄であろう.

コード:

Text( LineNo );  //LineNo行目を表示する
とか1個だけ書いとけばよくない?
あとは LineNo の値を適切に変えていくだけだ.例えば既に回答されている仕組みをそのまま用いればよいのではあるまいか.

アバター
usao
記事: 1887
登録日時: 11年前

Re: Dxlibの表示された文字の消し方

#5

投稿記事 by usao » 1年前

オフトピック
あと,「文字を消す」という文言がちょっと気になるなぁ.

> while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0 && UpdateKey() == 0){

とかいうループを書いている時点で,「描画したものは毎回消えている」のではあるまいか.

そしたら,やりたいことは「表示した物を消したい」じゃなくて「所望のものだけを描画したい」という形に表現されるべき場面ではないかと思える.

返信

“C言語何でも質問掲示板” へ戻る