ページ 1 / 1
RPGの戦闘システムについて
Posted: 2010年11月17日(水) 00:00
by タンデム
こんにちは。
友人とRPGを作成することになり、私は戦闘システムを担当することになりました。
C言語によるゲームの作成自体が初めてのため、
どのような構成にすれば良いのか悩んでおります。
システムとしてはスタンダードなサイドビューの戦闘で、
ターン制ではなくATBにする予定です。
基本的にはループの中で状態遷移させて処理させる流れで良いかと認識しているのですが、
具体的には下記のような設計で良いのでしょうか?
また、何か参考になるサイトや勉強方法等ありましたら、ご教示下さい。
while (1)
{
switch( 戦闘状態 )
{
case 戦闘開始:
//戦闘開始処理
戦闘開始関数呼び出し
break;
case 待ち状態:
//ATB増加処理
待ち状態時関数呼び出し
break;
case コマンド選択:
//コマンド選択および各コマンド処理
コマンド選択処理関数呼び出し
break;
case 戦闘アニメ再生中:
//戦闘アニメ再生処理
戦闘アニメ再生関数呼び出し
break;
case 敵行動中:
//敵行動選択処理
敵行動関数呼び出し
case 戦闘終了:
//戦闘終了処理
戦闘終了関数呼び出し
break;
default:
break;
}
}
Re:RPGの戦闘システムについて
Posted: 2010年11月17日(水) 00:18
by softya
管理人さんの「RPGのサンプル」はATBぽかった気がします。
http://dixq.net/sm/d10.html
他には、まずサンプルは見当たらないですね。
>基本的にはループの中で状態遷移させて処理させる流れで良いかと認識しているのですが、
>具体的には下記のような設計で良いのでしょうか?
メッセージループとか描画処理やらスクリーンフリップがどうなっている気になるのですが何処にあるのでしょうか?あと、DXライブラリですか?
細かく言うと敵の死亡処理とか味方の死亡処理・エフェクトは何処にあるかとかターンごとのダメージ回復とか色々細かく処理は積み重なるので単一のswitch~caseで処理できるのかは疑問です。
それにキャラ毎の遷移も必要な気がします。
もしプログラミング自体の初心者ならば、FF的なアニメ豊富で複雑な戦闘システムを組むのはかなり無謀だと思います。アクションゲームが楽勝で組める経験はお持ちでしょうか?
【追記】
まず、戦闘中に起こりうる状態と並行して起こる状態を表にして整理して見た方が良いと思います。
例えば、FFで言うと竜騎士がジャンプ攻撃中に魔法使いの呪文詠唱とATBメーターの蓄積は並行で起こりますよね。今の状態遷移は、それを処理できません。

Re:RPGの戦闘システムについて
Posted: 2010年11月17日(水) 00:34
by softya
横視点でDQ的なターン制ですが
DRAGMENTS LOAR
http://rpg.nengu.jp/game/dl/
ソースコードも公開されています。
紹介動画
http://zoome.jp/dxlib/diary/7
いつまでに完成させる予定かも良かったら教えてください。
Re:RPGの戦闘システムについて
Posted: 2010年11月17日(水) 13:14
by タンデム
softya様
お返事ありがとうございます。
質問が曖昧で申し訳ありませんでした。
DXライブラリを使用しての作成です。
プログラミング歴としてはCが二年のC++が半年程度ですが、普段行っているプログラミングが電子機器の組み込みなのですがゲームのプログラムとは勝手がかなり違い、それを理解しきれていない状態です。
また、ゲーム作成の経験については某有名なRPG作成ツールを使用して何作か完成させましたので、どのようなインターフェースが必要なのか等はある程度イメージ出来ています。
記載したソースはかなりざっくりなので細かい処理まで書いていないのですが、スクリーンフリップはこのスイッチ文を抜けたところで呼び出すつもりです。
今、出先で携帯からの書き込みのため後ほどもう少し詳細なコードを記載します。
完成予定は来年の春頃を目処にしています。
Re:RPGの戦闘システムについて
Posted: 2010年11月17日(水) 14:51
by softya
>プログラミング歴としてはCが二年のC++が半年程度ですが、普段行っているプログラミングが電子機器の組み込みなのですがゲームのプログラムとは勝手がかなり違い、それを理解しきれていない状態です。
>また、ゲーム作成の経験については某有名なRPG作成ツールを使用して何作か完成させましたので、どのようなインターフェースが必要なのか等はある程度イメージ出来ています。
それだけの経験があれば、FF並とまでは無理でしょうがある程度出来ると思います。
FF4クラスでも凄い開発工数がかかってるんで同レベルはかなり難しいでしょうが、ある程度省略というか妥協は必要かと思います。
それと侮れないのがFFのボスだけに施されている特殊処理です。普通の戦闘システム以外に、これも作業時間が掛かりますのでゲームシステムの設計者と最初に話を良くしておいてください。
とりあえず戦闘中に起こり得る状態を全て書き出して、まず状態遷移図を書いてみてはどうでしょうか?
私の書いたような竜騎士のジャンプ攻撃とか魔法詠唱とか状態遷移が特殊になるものは全て書きだした方が良いと思います。
それと単独ではなくパーティ編成されると思いますので、パーティメンバー毎に状態遷移する事になると思いますので、そこも考慮してください。
Re:RPGの戦闘システムについて
Posted: 2010年11月17日(水) 23:58
by タンデム
今回作成するRPGは初めてということもあり、竜騎士のジャンプや魔法詠唱といった複数のアクションが並列的に動作することは考えておらず、すべてのアクションが選択したらそのターンで終了する直線的なシステムにしようと考えております。
softya様のアドバイス通り、主要な状態遷移をピックアップしてみて、管理人さんのサンプルを参考にして再度簡単なコードを書いてみましたが、いかがでしょうか?
あくまで戦闘システムの基幹部のイメージを掴みたいだけなので、主要なコマンドのみの記載で細かい部分は省略しております。
少々長いですが、お付き合い下さい。
int battle_main()
{
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE])
{
if ( 初回呼び出し )
戦闘初期化処理();
//並列的に行われる処理
各種戦闘画面描画処理();//背景等どの状態でも描画するものだけ
戦闘キャラクターの描画処理();//キャラの状態等によって描画する画像を切り替える
モンスター描画処理();
ATBゲージ表示処理();//キャラのATB値を参照してゲージを描画する
各種メッセージの描画処理();
//並列的に行われない処理
switch ( 戦闘状態 )
{
case 戦闘開始:
戦闘開始処理();//戦闘開始処理が終了したら戦闘状態を"待ち"に遷移
break;
case 待ち:
ATB増加処理();//味方の誰かのATBがMAXになったら戦闘状態を"コマンド選択"に遷移
//敵の誰かのATBがMAXになったら戦闘状態を"敵行動"に遷移"
break;
case コマンド選択:
if ( キャラの防御状態 == true )
キャラの防御状態フラグ = false;
選択項目描画処理();
キー入力判定処理();//決定キーが押されたら戦闘状態を決定キーが押されたコマンドに遷移
break;
case 攻撃:
エフェクト描画処理();
ヒット数描画処理();
ダメージ計算処理();
ダメージ描画処理();
if ( 全攻撃処理終了 )
{
if ( 対象敵HP <= 0 )
戦闘状態 = 敵消滅;
else
戦闘状態 = 待ち;
}
break;
case 防御:
キャラの防御状態フラグ = true;
戦闘状態 = 待ち;
break;
case 敵消滅:
対象敵状態 = 消滅;
if ( 敵消滅エフェクト描画処理() == 終了 )
{
if ( 敵全滅 == true )
戦闘状態 = 戦闘終了;
else
戦闘状態 = 待ち;
}
break;
case 敵行動:
敵行動決定処理();//乱数にて敵の行動を決定する
敵行動処理();//行われた行動が終了次第次の状態に遷移する
break;
case キャラ消滅
キャラ状態 = 消滅;
if ( キャラ消滅エフェクト描画処理(); == 終了 )
{
if ( 味方全滅 == true )
戦闘状態 = ゲームオーバー;
else
戦闘状態 = 待ち;
}
break;
case 戦闘終了:
戦闘終了処理();
break;
case ゲームオーバー;
ゲームオーバー処理();
break;
default:
break;
}
}
ScreenFlip();
}
Re:RPGの戦闘システムについて
Posted: 2010年11月18日(木) 01:41
by softya
状態遷移を図にまとえてみました。
こんな感じですかね?
敵と味方を同列にATBで処理しないとマズイと思ったので書き換えてあります。
全体的には、基本的なことは出来ていると思いますよ。
細かい点で気になることを2~3つ書きます。
細かい話としては描画処理は、ScreenFlip(); 前の最後にまとめたほうが良いと思います。
状態を決める前に描画することになるので支障が出来ます。
それと気になるのは、「攻撃」の時に
エフェクト描画処理();
ヒット数描画処理();
ダメージ計算処理();
ダメージ描画処理();
は全て並行処理ですよね。
つまり全て1/60秒毎のScreenFlip();の処理に戻る必要があります。
なので、状態遷移後の経過フレーム数をカウントしないとタイミングが取れないと思います。
まぁ、他の処理にも言えるのですが。
例えば、
敵行動決定処理();//乱数にて敵の行動を決定する
遷移直後の最初のフレームだけの処理じゃないですか。
ぐらいでしょうか。
あとは戦闘システム次第の所もありますので、戦闘システムを良く検討してみてください。
【追記】
と言っても検討しまくっても抜けはあるんで基本路線が決まったらさっさと作り始めて問題が出たら直していったほうが速いと思います。

Re:RPGの戦闘システムについて
Posted: 2010年11月18日(木) 23:43
by タンデム
softya様
状態遷移図までありがとうございます。
かなりイメージ出来ました。
>それと気になるのは、「攻撃」の時に
> エフェクト描画処理();
> ヒット数描画処理();
> ダメージ計算処理();
> ダメージ描画処理();
>は全て並行処理ですよね。
>
>つまり全て1/60秒毎のScreenFlip();の処理に戻る必要があります。
>なので、状態遷移後の経過フレーム数をカウントしないとタイミングが取れないと思います。
上記の制約については理解しております。
コードには記載していないのですが、
複数フレーム処理が必要なすべての処理関数は内部にstaticのカウンタを保持しており、
戻り値にてすべてのフレーム処理が完了しかのかを判断しようかと考えております。
>と言っても検討しまくっても抜けはあるんで基本路線が決まったらさっさと作り始めて問題が出たら直していったほうが速いと思います。
そうですね。魔法や逃走などの応用状態も考慮した状態遷移図を作成してから、
上記のコードをベースに作成してみようと思います。