ページ 11

メッセージを閉じる

Posted: 2013年1月19日(土) 02:09
by ジャン
今RPGのメッセージ処理で困っています。
whileの中でメッセーシを表示してボタンを押したらメッセージを閉じるにはどうしたらいいですか?

コード:

while(1){
	while(1){
		DrawFormatString( 0, 15, GetColor(255,255,255), " %sを5個手に入れた", item1[0].name) ;
		if(Keyboard_Get( KEY_INPUT_D )==1)
			break;
	}
}
これならフリーズしてしまいます。
よろしくお願いします。

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 11:42
by softya(ソフト屋)
ゲームでは、基本のメインループの中で指定回数ループ以外のループを作ることはできません(メッセージ処理に支障が出るため)。

それとバグの問題があるためです。
あちこちに
・ProcessMessage(); メッセージ処理を行います。
・ClearDrawScreen(); 画面のクリアを行います。
・ScreenFlip(); 裏画面を表画面に反映します。
・WaitTimer() 指定の時間だけ処理をとめる
・WaitKey  キーの入力待ち
の処理を入れる事自体がバグ(一瞬の黒画面や終了できないなど)を誘発します。

こういうRPGなどメッセージ処理は、今メッセージ処理にいると言う条件フラグで管理します。
プログラム的には毎フレーム必ずDrawFormatStringを行なってすぐさまメインループに戻ってください。

[補足]
簡単に書けば、
・while(1)のループはしない。
・出来るだけ短い時間の処理でメインループに戻る。
・1つのプログラムに、ProcessMessage();は1つだけ。
を心がけてください。

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 15:55
by ジャン
大変わかり易い解説ありがとうございます。
すべてフラグでやっているんですね。
フラグ管理がめんどくさそうです。
そうなるとノベルゲームで次のページを表示するたびに新しいフラグを作っているんですか?

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 16:04
by softya(ソフト屋)
ノベルゲームですか?
通常はメッセージやら制御コマンドはすべてテキストファイル化するとかスクリプトファイル化します。
この場合プログラムは制御コマンドにしたがってメッセージを表示させるだけなので、メッセージ表示というコマンド単体で見ればメッセージ表示中のフラグはプログラム全体で1個で済むことになります。

DXライブラリで作ったスクリプト処理のサンプルが幾つかあるので参考にされてはどうでしょう?
「DXライブラリ置き場 サンプルゲームダウンロードページ」
http://homepage2.nifty.com/natupaji/DxLib/dxsample.html
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
とても良いサンプルとは言えない面もありますが。

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 16:05
by Ryo
フラグといっても、true,falseの2値だけをあつかうものではなく
「現在の状態」を、保持する一つの変数をつくり
表示(更新)中、ボタン押し待ち、などの状態をいれかえていけばいい。

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 16:52
by ジャン
>>softya(ソフト屋) さん

制御コマンドとはなんですか?
htmlのタグのようなものですか?

>>Ryoさん

そんなやり方があったのですね。
でもこうできるのはcharにまとめて文字を代入した時だけですよね?
rpgの宝箱を手に入れた時とかはboolで新しくフラグを立てるしかないですよね?

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 17:04
by softya(ソフト屋)
>制御コマンドとはなんですか?
>htmlのタグのようなものですか?

制御コマンドは自分で作るので、どうとでもなります。
HTMLに似たxml形式やら、スクリプト言語風のものや、Lua言語を使ったもの、Excelのcsv形式で1つ目の列をコマンド文字とするもの色々ありますので画一ではありません。
どう作っても良いので作る人毎に違います。

私の書いたRPG講座ですが、シナリオは簡易化のためコマンドを配列データとして持っています。
本格的にするには上に書いたようにファイル化することが望ましいですが、あえて簡単な配列データにしてあります。良かったら参考にしてください。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2

【追記】 こんな風にしている人もいます。
「ゲームシステム仕様書」
http://www42.tok2.com/home/mutura/


>rpgの宝箱を手に入れた時とかはboolで新しくフラグを立てるしかないですよね?

宝箱とかシナリオの変数はセーブの都合があるので配列とか扱いやすい形で持つべきですね。
宝箱配列とか、シナリオ変数値配列とかです。

それとRyoさんの書かれた方法は状態遷移変数[誤字修正]により状態遷移の制御でゲームや機械制御では一般的に使われています。
例えば、オープンニングやタイトル画面、ゲーム本編を切り替えるにも状態遷移変数は使われます。

Re: メッセージを閉じる

Posted: 2013年1月19日(土) 17:32
by ジャン
アドバイスありがとうございました。
色々、参考になったのでなんとか作ってみようと思います。