トップページ > 過去ログ > 記事閲覧
ターン制の戦闘について
名前:LINK 日時: 2011/02/10 19:34

現在、ドラクエのようなRPGを作成しているのですが、ターン制の戦闘のプログラムの方法がわかりません。 一応かなりおおまかですが、このような感じかなと思っているのですが、どうすればよいのでしょうか? ちなみに、マップや戦闘画面の移行はswitchを使ってそれぞれの関数を呼び出す方法にしています。 if(battlestart == 0){ //戦闘開始時に自分と敵の素早さを比較 if(hero.sp > ENEMYSPEED) { MyTurn = 1 ; EnemyTurn = 0 ; //自分のほうが速かったら現在自分のターンとする } if(hero.sp < ENEMYSPEED) { MyTurn = 0 ; EnemyTurn = 1 ; //敵のほうが速かったら現在相手のターンとする } battlestart = 1 ; //素早さの比較を終了 } if(MyTurn == 1) { ///////////////////////コマンド入力/////////////////////////////// //////////////////////戦闘エフェクト////////////////////////////// //////////////////////ダメージ計算//////////////////////////////// /////////////////////相手ターンに移行//////////////////////////// } if(EnemyTurn == 1) { //////////////////////戦闘エフェクト////////////////////////////// //////////////////////ダメージ計算//////////////////////////////// /////////////////////相手ターンに移行//////////////////////////// } それと、一つ気になったんですが、処理の面などでifは多用しないほうがよいのでしょうか?

Page: 1 |

Re: ターン制の戦闘について ( No.1 )
名前:すがり 日時:2011/02/10 21:56

ドラクエのようなオーソドックスなコマンド入力式の戦闘であれば、大ざっぱに ・戦闘開始処理 ・ターン開始処理(ループ:戦闘ターン)   ・プレイヤーの入力受け付け   ・行動開始処理(行動順の決定など)   ・キャラ毎に処理(ループ:行動キャラ)     ・行動     ・エフェクトや各種判定など   ・ループ ・ループ ・戦闘終了処理 といったところでしょうか。 処理負荷に関しては、各種演算が数百万回規模になってくるまでは気にする必要は無いかと思います。描画負荷に比べれば微々たるものです。 ただ、あまりif文が乱れ飛ぶと保守性が悪くなるので、マクロ定数などを利用してコンパクトに記述することを心がけると良いと思います。
Re: ターン制の戦闘について ( No.2 )
名前:T 日時:2011/02/10 23:05

#define ENEMY_TURN 1 #define MY_TURN 0 int Turn; if(hero.sp >= ENEMYSPEED) { Turn = MY_TURN; } else { Turn = ENEMY_TURN; } switch(Turn) { case MY_TURN: /* 処理 */ break; case ENEMY_TURN: /* 処理 */ break; } 変数は少ないほうが良いらしいので上記みたいな方が良いかもしれません
Re: ターン制の戦闘について ( No.3 )
名前:LINK 日時:2011/02/11 15:24

コメントありがとうございます。 だいぶイメージがつかめてきたので頑張って作ってみたいと思います。
Re: ターン制の戦闘について ( No.4 )
名前:LINK 日時:2011/02/11 16:39

一応こんな感じで作ってみたのですが(一対一の戦闘でしか利用できないと思いますが)、 マップで敵と遭遇した瞬間に戦闘画面にならずフリーズしてしまいます。 何がいけないのでしょうか? 遷移の仕方はまだ簡単にしてあります。 void BATTLE(int E) { turn = Start ; int MyTurnCount = 0 ; int EnemyTurnCount = 0 ; int EnemyHP = 50 ; while( ProcessMessage() == 0 && EnemyHP > 0 ) { ClearDrawScreen() ; DrawGraph(0,0,sougen,TRUE) ; DrawGraph(250,100,enemy[E],TRUE) ; switch(turn) { case Start : //戦闘開始処理 DrawString(260,450,"敵が現れた",GetColor(0,0,0)) ;//戦闘開始時のメッセージの表示など if(KeyCount[KEY_INPUT_S]==1){ turn = Command ; } break ; case Command : //コマンド入力処理 DrawString(260,450,"HIT C KEY",GetColor(0,255,0)) ; if(KeyCount[KEY_INPUT_C]==1){ if(hero.sp >= ENEMYSPEED) { turn = MyTurn ; //自分のほうが速かったら現在自分のターンとする } else { turn = EnemyTurn ; //敵のほうが速かったら現在相手のターンとする } } break ; case MyTurn : DrawString(260,450,"現在自分のターンの処理中",GetColor(0,255,0)) ;//ダメージ計算やエフェクトの描画 if(KeyCount[KEY_INPUT_T]==1) turn = MyTurnEnd ; if(KeyCount[KEY_INPUT_D]==1) EnemyHP = 0 ; break ; case MyTurnEnd : //自分ターンの終了処理 MyTurnCount ++ ; //ターン終了時にMyturnCountに1を加える if(MyTurnCount = EnemyTurnCount){ //MyTurnCountとEnemyTurnCountを比較して、=ならコマンドに移行 turn = Command ; } else{ //違ったら敵のターンにする turn = EnemyTurn ; } break ; case EnemyTurn : DrawString(260,450,"現在相手のターンの処理中",GetColor(0,255,0)) ;//ダメージ計算やエフェクトの描画 if(KeyCount[KEY_INPUT_T]==1) turn = EnemyTurnEnd ; break ; case EnemyTurnEnd : //敵のターンの終了処理 EnemyTurnCount ++ ; //ターン終了時にEnemyturnCountに1を加える if(EnemyTurnCount == MyTurnCount){ //MyTurnCountとEnemyTurnCountを比較して、=ならコマンドに移行 turn = Command ; } else{ //違ったら自分のターンに移行 turn = MyTurn ; } break ; } } hero.gamen = 3 ; //マップ画面へ }
Re: ターン制の戦闘について ( No.5 )
名前:Will 日時:2011/02/11 17:10

そのwhileループの中にGetHitKeyStateAllでKeyCountを更新しているところがないからじゃないですか。
Re: ターン制の戦闘について ( No.6 )
名前:LINK 日時:2011/02/11 19:09

やってみましたが、やはりフリーズしてしまいます。
Re: ターン制の戦闘について ( No.7 )
名前:いっち 日時:2011/02/11 21:38

何も表示されないのでしょうか? ScreenFlip を忘れているとか・・・。
Re: ターン制の戦闘について(解決) ( No.8 )
名前:LINK 日時:2011/02/11 21:56

いっちさんのご指摘どおりでした。 すいません、基本的な部分を忘れていました。 みなさんありがとうございました。

Page: 1 |