簡単RPG講座 番外編 RPG講座を応用するための練習問題。

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

簡単RPG講座 番外編 RPG講座を応用するための練習問題。

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

さて、ここでRPG講座を読まれている方のため応用練習問題を出してみましょう。

ベースにするプロジェクトは、こちらです。
●DXライブラリ非同梱版(ファイルサイズが小さい) DXライブラリは自分でインストールされている人向け。

[拡張子 zip は無効化されているため、表示できません]

●DXライブラリ同梱版(ファイルサイズが大)
http://softyasu.net/dlcounter/?id=EASYR ... 00DXLIBzip(3.3MB)
NNKさんの要望によりDXライブラリを同梱しております。
そのためファイルが大きいのでダウンロード元が別になっています。

[問題1]
RPG講座8に登場したキャラクタの管理モジュールであるchar.cpp/hを使って、キャラクタがランダムに歩きまわる(操作不要)処理を作ってください。
ヒント:経過フレーム数をカウントする必要があります。

[問題2]
RPG講座9に登場したウィンドウシステムwinMng.cpp/hを使って、クイズを作成してください。とりあえず1問のクイズが作れたら合格です。
ヒント:状態遷移が必要ですので、stateMng.cpp/hが添付してありますが使う使わないはお任せします。

しばらく見本回答は載せませんで、チャレンジしてぜひコメントで回答をお寄せください。
どちらか一方の回答でもOKです。
楽しみにお待ちしています。[
最後に編集したユーザー softya(ソフト屋) on 2010年12月01日(水) 00:17 [ 編集 5 回目 ]

ああ
記事: 49
登録日時: 14年前

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

投稿記事 by ああ » 14年前

実はDXライブラリ持ってないから参加出来ないです・・・orz
ダウンロードする度に思ってたんですが、実行ファイルが嬉しいなぁってw

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

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

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

DXライブラリを導入されていないのは何か理由が?
ダウンロードして設定するだけなのでさほどの手間とも思えないんですが。

exeファイル添付は検討します。

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

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

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

NNKさんの要望により、DXライブラリ同梱版をご用意しました。
ダウンロードするだけでDXライブラリを導入していなくてもDXライブラリが使えます。


きょーちゃん
記事: 11
登録日時: 15年前

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

投稿記事 by きょーちゃん » 14年前

ようやく問題1が解けました。char.cpp/h以外もいじってしまったのですが・・・

まず、comsub.cppのFPS計算のところに、キャラが動くかどうかのフラグを追加しました。
flag_moveってのがそうです。

CODE:

//----------------------------------------------------------------------
//	FPS計算
//----------------------------------------------------------------------
void CalcFps(int fps)
{
	static int beforeTime=0,frameTime[100],count=0;
	flag_move=0;
	
 
 	//	fpsの範囲外をチェック
 	MACRO_ASSERT(fps0);
 
 	//	フレームあたりの時間を記録。
 	if( count==0 ) {
		frameTime[count%fps] = 0;
	} else {
		frameTime[count%fps] = GetNowCount()-beforeTime;
	}
	beforeTime=GetNowCount();
 	count++;	
	
	//	最後のフレーム
	if((count%fps) == (fps-1) ){
		//	平均フレーム時間を計算する。
		s_AveTime=0;
		for(int i=0;i608)px_hero=608;
	if(py_hero>448)py_hero=448;
	char_Draw(name,px_hero,py_hero,ch_muki,anim);
	
}
あとはメインループでこの関数を呼び出しています。

RandamCharMove(hero,CheckMoveFlag());

ちなみに引数のheroってのはこういうものです。「ゲームプログラミングの館」のキャラ画像を使っています。
CHAR_OBJECT hero = char_Load( "char.png" ,4,4);

ちょこまか動きすぎでしょうか・・・こんな村人キャラいたら話しかけられませんね(汗
それと、画面の端っこに行ったときは足踏みしてほしかったのですが、やりかたがわかりませんでした。これだと完全に動きをとめてしまいます。
とっても読みづらいコードで申し訳ないのですが、どうかご指導下さい。

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

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

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

はい。確認させていただきました。
ちゃんと動いていますね~。ちゃんと理解されているようで嬉しいです。

で、アルゴリズム的な改善点としては
・きょーちゃんさんも気付いてますが、歩かない期間を設けた方が話しかけやすくなります。動く→休むを繰り返す感じですね。
・あとマップの端で硬直するので画面の端を超えそうになったら再度移動方向を決め直したほうが良いです。
・足踏みはanimを座標だけで決めているのが問題でしょうか。フレームで変更するようにすると足踏できるようになります。

あとプログラムの設計の問題ですが、

・CalcFpsに移動フラグの処理を潜り込ませるのはCalcFps関数の機能を曖昧にするのでお行儀の良い方法じゃないですね。
なぜかというと、他の人が見たときに移動フラグが何故ここにあるか理解に苦しむと思います。
なので、こんな感じで2度手間でも別のところで処理してください。

CODE:

	int walkcount = 0;//先頭で定義
中略
		//	ここに処理を追加。
		walkcount = (walkcount +1) % FPS;//周期はFPS
		RandamCharMove(hero,(walkcount ==0));//最初なら動く
・今回の場合はこれでも良いのですが、出来ればRandamCharMove内にはchar_Drawを含まないほうが良いですね。
色んな描画処理やらを積み重ねる様になってくると移動処理と描画は分けてあったほうが便利です。
その場合は情報は構造体引数で受渡すのがベストで、そうすればキャラクタを2体出すことも出来るようになります。

きょーちゃん
記事: 11
登録日時: 15年前

Re: 簡単RPG講座 番外編 RPG講座を応用するための練習問題。

投稿記事 by きょーちゃん » 14年前

わ~さっそく見て下さったんですね!ありがとうございます(≧∇≦)
実はFPSの使い方が分からなくて、あんなところにフラグを忍ばせてしまいました^^;
なるほど・・・こうやって使えばいいのですね。
もうキャラを動かすことに精一杯で、後先考えずに無理やり動かしてました。
今後はもう少し他人が見た時のこととか、処理を増やす時のこととか考えて書くよう心がけます。
まずは指摘していただいたところを直して、それから問題2に挑戦してみようと思います。
すっごく勉強になります。ありがとうございました!!