メッセージを閉じる

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

メッセージを閉じる

#1

投稿記事 by ジャン » 13年前

今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;
	}
}
これならフリーズしてしまいます。
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メッセージを閉じる

#2

投稿記事 by softya(ソフト屋) » 13年前

ゲームでは、基本のメインループの中で指定回数ループ以外のループを作ることはできません(メッセージ処理に支障が出るため)。

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

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

[補足]
簡単に書けば、
・while(1)のループはしない。
・出来るだけ短い時間の処理でメインループに戻る。
・1つのプログラムに、ProcessMessage();は1つだけ。
を心がけてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ジャン

Re: メッセージを閉じる

#3

投稿記事 by ジャン » 13年前

大変わかり易い解説ありがとうございます。
すべてフラグでやっているんですね。
フラグ管理がめんどくさそうです。
そうなるとノベルゲームで次のページを表示するたびに新しいフラグを作っているんですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メッセージを閉じる

#4

投稿記事 by softya(ソフト屋) » 13年前

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

DXライブラリで作ったスクリプト処理のサンプルが幾つかあるので参考にされてはどうでしょう?
「DXライブラリ置き場 サンプルゲームダウンロードページ」
http://homepage2.nifty.com/natupaji/DxLib/dxsample.html
「ゲーム作りで学ぶ! 実践的C言語プログラミング - karetta.jp」
http://karetta.jp/book-cover/game-programming
とても良いサンプルとは言えない面もありますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Ryo

Re: メッセージを閉じる

#5

投稿記事 by Ryo » 13年前

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

ジャン

Re: メッセージを閉じる

#6

投稿記事 by ジャン » 13年前

>>softya(ソフト屋) さん

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

>>Ryoさん

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メッセージを閉じる

#7

投稿記事 by softya(ソフト屋) » 13年前

>制御コマンドとはなんですか?
>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さんの書かれた方法は状態遷移変数[誤字修正]により状態遷移の制御でゲームや機械制御では一般的に使われています。
例えば、オープンニングやタイトル画面、ゲーム本編を切り替えるにも状態遷移変数は使われます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ジャン

Re: メッセージを閉じる

#8

投稿記事 by ジャン » 13年前

アドバイスありがとうございました。
色々、参考になったのでなんとか作ってみようと思います。

閉鎖

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