ページ 11

RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月21日(火) 13:18
by nito
質問内容
主人公がとある地点でキーボードのAkeyを取得した時に、会話が始まるようなプログラムが組みたいのですが、
今の状態ですと、Akey1回で会話をスムーズに行うことが出来ません。
また、そのせいで会話が終了した直後に再度会話を取得してしまうことがあります。
Akey1回毎に、会話を次へと表示させて、一旦終了させ再びAkeyを押した時に会話をさせるにはどうすればよいでしょうか。

その他に、会話のテキストを1文字ずつ時間をあけて表示させる場合のプログラム、または関数について教えて下さると助かります。

VisualStudio 2013
DXライブラリ
を使用しております。

コード:

		if (CheckHitKey(KEY_INPUT_A) == 1 && control[4] == 1){
				brack = GetColor(0, 0, 0);//黒色
				red = GetColor(255, 0, 0);//黒色
				white = GetColor(255, 255, 255);//白色
				DrawBox(50, 330, 320, 444, white, TRUE);
				DrawFormatString(62, 350, brack, "今あなたは元気ですか?");
				ScreenFlip();
				WaitTimer(100);
				WaitKey();
				control[4] = 2;
			}
			if (control[4] == 2){
				DrawBox(50, 330, 320, 444, white, TRUE);
				while (a == 0){
					if (CheckHitKey(KEY_INPUT_UP) == 1)
						b = 0;
					if (CheckHitKey(KEY_INPUT_DOWN) == 1)
						b = 1;
					if (b == 0){
						DrawFormatString(62, 350, red, "はい");
						DrawFormatString(62, 382, brack, "いいえ");
						ScreenFlip();
						WaitTimer(75);
						if (CheckHitKey(KEY_INPUT_A) == 1)
							a = 1;
					}
					if (b == 1){
						DrawFormatString(62, 350, brack, "はい");
						DrawFormatString(62, 382, red, "いいえ");
						ScreenFlip();
						WaitTimer(75);
						if (CheckHitKey(KEY_INPUT_A) == 1)
							a = 2;
					}
					WaitTimer(200);
				}
				while (a != 0){
					DrawBox(50, 330, 320, 444, white, TRUE);
					if (a == 1){
						DrawFormatString(62, 350, brack, "そうですか!");
						DrawFormatString(62, 370, brack, "それはよかったです!");
						ScreenFlip();
						WaitTimer(100);
						if (CheckHitKey(KEY_INPUT_A) == 1)
							a = 0;
					}
					if (a == 2)
					{
						DrawFormatString(62, 350, brack, "元気ないのですか・・・。");
						DrawFormatString(62, 370, brack, "体調には気を付けてくださいね。");
						ScreenFlip();
						WaitTimer(100);
						if (CheckHitKey(KEY_INPUT_A) == 1)
							a = 0;
					}
				}

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月21日(火) 15:37
by Aozora0630
まず、関数やクラス、オブジェクト指向のことを勉強してからゲームを作った方がいいです。

BASICでもやっているのですか?と聞きたくなるようなコードです。
(いや、BASICにも関数機能あった気がする)

私のおすすめはここです。
まずはここでCの基本を学んでください。
どうやらVisualの様ですがプレーンなCを学べばほとんどの言語で役に立ちます。

そして、コンソールアプリケーション作りになれてからDxLibやらWin32APIを使ってください。

いいコードの規則
1, 同じコードを二度書かない。
(貴方のコードは同じ事を何回も何回もコピペして作った感満載です。この様な作り方をするとメンテナンスが大変になります。)
2, 英語はスペルを正しくかく。
(ブラックのスペルはBrackでは無くBlackです。変数名などの英語は正しく書いた方がいいです。)
他にもいっぱいありますが、貴方のソースで目立ったのはこの2つです。
オフトピック
まあ、私も言えたもんじゃないですけどねw

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月21日(火) 16:13
by Tatu
一度、このサイトのゲームプログラミングの館など
ゲームプログラミングについて解説しているWebサイトや書籍をいくつか見ることをおすすめします。

会話の制御については
DXライブラリ置場( http://homepage2.nifty.com/natupaji/DxLib/ )の
DXライブラリサンプルプログラムのページにあるサウンドノベル風文字列描画が参考になるかもしれません。

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月21日(火) 16:41
by softya(ソフト屋)
キーボードの押下状態を把握するためには、キーの押下直後、押下中、未押下の3つの状態を管理しなくてはいけません。
メッセージを次に送るのは押下直後だけです。

そういう仕組は、ここの「ゲームプログラミングの館」などで紹介されていますので、よく読んで・実行や改造して理解される良いと思います。
「ゲームプログラミングの館」を読めば、プログラム構造的にもまずい所がわかると思いますので、わからないことは質問してくださいね。

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月21日(火) 18:09
by Aozora0630
な、なんか皆このサイトを勧めるなぁ・・・。

確かに、ゲームプログラミングから始めるのならこのサイトの「ゲームプログラミングの館」がいいかもしれませんね。

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月23日(木) 10:31
by nito
もうすこし具体的なことについてお願いしたいです。
DXライブラリサンプルプログラムのページにあるサウンドノベル風文字列描画は、実行済みです。
関数機能は、後にリファクタリングしてから行いたいです。
作成自体初心者のため分かりやすい感じでお願いします。
ヒントとなるページ参考のプログラムについて教えて頂けたらと思います。

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月23日(木) 11:25
by softya(ソフト屋)
ゲームプログラミングの館(http://dixq.net/g/)を理解してほしいと書いたのは、

コード:

                ScreenFlip();
                WaitTimer(100);
                WaitKey();
これがプログラム構造的に非常にまずいからで、現状の行数程度が作成の限界です。
関数を使わずに書けないことはないけど、めちゃくちゃ面倒でバグが出たら絶対直したくないプログラムコードが出来上がります。
効率アップやらバグを避けるために関数は使うんですから。
あとでリファクタリングと書かれていますが、今から対応してないと根本的な作り直しに成ります。
なので、「ゲームプログラミングの館」のキー処理やメニューやプログラム構造などを学んだ上で作って欲しいのです。
一文字つづの表示となると更に知識が必要です。

・DXライブラリ入門編 
・DXライブラリの関数の使い方(基本)
・補足資料  h.11 書いてはいけない4つの処理
・ゲームプログラミング設計 
・メニュー画面の作り方

あたりは、理解して欲しい項目ですね。

【補足】
実のところRPG・ノベル的な処理は超初心者向きとは言えないのです。
会話もメニューも応用面の知識が必要で、避けて通れません。

Re: RPG等の会話をスムーズにするためにはどうすればよいか。

Posted: 2015年7月23日(木) 13:41
by nito
分かりました。
サイトの方を少し試してみて、再度分からないことがあれば、のち質問しに参ります。
構造上の問題点や理解すべき項目等のご指摘ありがとうございます。