ゲープロ講座セッション6:戦術型SLGの移動アルゴリズム(5)
- 基本ルーチンの実装へ |
こんにちは、鷹月ぐみなです。最近は色々と忙しくなってしまって、私自身がSLGをあまりプレイしなくなってしまいました(^^;)。代わりというか、作り手側(たかつきCOMPANY)として、ファンタジーSLGを製作する企画が一つあるので、ひょっとしたら秋頃にでも出すかも知れません。 さてさて、「戦術型SLG」の基礎講座は前回で終わりです。今回以降、実際のゲームのルーチンの雛型的なものを組み立てていきます。理解しやすいように気を使って書いていくつもりですが、それでも分からなくなったら前に戻るなり、鷹月に聞くなりしてください。せっかくここまで読んできたわけですから、最後まで理解した方が得ですしね。 |
では始めましょう。今まではSLGを構成するものを要素に分解し、紹介してきました。情報処理用語ではトップダウンと言います。ここからはその逆のプロセスを辿ります。即ちゲームを作るいろんな要素を結合し、SLGシステムを作っていくのです。これはボトムアップと呼ばれます……と、先日情報処理技術者になったので、それらしく言葉を添えてみるのでした(笑)。 SLGシステムと言っても、そのままゲームで使われている所までは作りません。手ほどきレベルで留めるって明言していますしね。基本的な流れが一通り実装できれば良いかな、と思います。その基本的な流れと言うやつは次のようになっています。
R-2) イベント発生フェイズ R-3) [Player's Turn] ユニット選択 R-4) [Player's Turn] 移動先座標選択 R-5) [Player's Turn] 最短移動 R-6) [Player's Turn] 攻撃相手選択 R-7) [Player's Turn] 攻撃処理 R-8) サブルーチン:生存判定 R-9) [Enemy's Turn] 最適探索 R-10) [Enemy's Turn] 敵さん側最短移動 R-11) [Enemy's Turn] 攻撃処理 R-12) サブルーチン:生存判定 R-13) ターン終了処理、R-2) に戻る なおここでは、タクティクスオウガにあるような「攻撃後移動」「WTによる移動順決定」「反撃処理」は入れていません。攻撃をしたら移動はもうできず、行動順は常にプレイヤーたち→敵さんたちが交互に行われ、攻撃した方は反撃を受けません。そういう仕様だと思ってください。 だいたい単語を読めばどんな流れになっているのか分かるとは思いますが、一応補足も兼ねて紹介しておきますね。
R-1) 初期処理
R-2) イベント発生フェイズ
R-3) ユニット選択
R-4) 移動先座標選択
R-5) 最短移動
R-6) 攻撃相手選択
R-7) 攻撃処理
R-8) 生存判定
R-9) 最適探索
R-10) 敵さん最短移動
R-11) 敵側攻撃処理
R-12) 生存判定 以上です。生存判定から全滅時の処理などに分岐したりしますが、それらは流れからは余剰だと思いますので今は無視します。ともかく、ここに示した基本と言うべき流れのSLGシステムを実装する事が、このSLG講座の最終目標としましょう。ようやく完全なビジョンを示しました。そう、講義を終わった頃には、この程度のSLGが作れる知識をGETしているというわけです。
|
早速設計……といきたいのですが、前回のサンプルアプリで実装した部分が R-3)、R-4)、R-5) だけだった事を考えると、いきなり増やしすぎですね。物事には順序があるというわけで、最終段階との間に一つ、中間点を設ける事にしましょう。それは次のような流れを持ちます。
S-2) [Player's Turn] ユニット選択(但し1キャラのみ) S-3) [Player's Turn] 移動先座標選択 S-4) [Player's Turn] プレイヤー最短移動 S-5) [Enemy's Turn] 最適探索 S-6) [Enemy's Turn] 敵さん側最短移動、そして S-2)に戻る
|
……準備はいいですね?ここからは完全にゲームの設計、製造へと進んでいきます。主体は移動アルゴリズムの実装ですが、一応はゲームの形を取るために、その他の事もいろいろ考える必要が出てきます。
|
このSLGシステムを作るために、考えるべきことがいくつかあります。まず今回ソースに追加されるべき敵さんの、行動パターンを決めておきましょう。あまり少ないのも何ですし、かといって多くても無意味なので、5体くらいがいいですね。それで、5体とも違った行動パターンを持たせることにします。
敵さんB:通常型(PCとの単純距離差が10以内なら近づいてくる) 敵さんC:守備型(PCとの単純距離差が3以内になった所で近づき、以後は距離に関係なく常にプレイヤーを追いかけるA型になる) 敵さんD:ピボット型(ある地点から単純距離半径6以上の地点へは何があっても進めない。その範囲の中でプレイヤーに近づこうとする) 敵さんE:アーチャー(単純距離差が10以内で近づくのだが、主人公からの単純距離差が3になる地点を確保しようとする) では次、プレイヤーと敵さんの移動歩数値を決めておきます。プレイヤーは7、敵は6とします。それに従って、地形の移動ウェイトを設定します。床を1、大理石の床を2、石の置物6、壁を12としておきます。それ以外のオブジェクトも強引にこの4種類のどれかに割り付けます。 次は音楽……まぁ、これは特にストーリーも何もないので、前回使わせてもらったみくしぎさんの「十字架の誓い」を再使用させてもらうことにします。 グラフィック系は……プレイヤーキャラは泣く大臣さんのFGPを使います。敵さんに関しては、タイプA〜Eが一目見て分かる、というために、いま適当にこしらえたものを使うことにしましょう。かきかき。
とまぁ、こんな風に現時点で決められそうな設定を確定させておきます。もちろんコーディングしている最中になって気が付く事もいくらでもありますが、後になって困るよりは今のうちにいくつか解決させておいた方がいいですよね。そういった細かい問題を二つほど挙げてみましょう。
|
□ マップへの相乗り問題
あるマスへ移動可か不可かは、セッション3で紹介した探索ルーチンを使うわけですが、この判断はあくまでマップ地形からしか判断していません。キャラの存在を考慮していないわけで、このままだとキャラ同士が同じマスに重なってしまう可能性が出てきます。もちろん原則的にあってはならない事象なので、解決させなくてはいけません。
A) 各々のマスに対して、その上にあるオブジェクト情報を付与する
B) 全キャラの居場所を調べる
もちろんプレイヤー自身はこの判定に加える必要はありません。多少、処理するのに時間がかかりますが、敵5匹程度ですから、気にするほどの処理落ちは出ないと思います。
|
□ 縦32ピクセル以上のキャラの表示順問題
今回使おうと思っているマップチップは32×32ピクセルですが、キャラクターは32×48という、1マスを出るサイズの大きさです。この場合、ちょうど上下に並んだときに、キャラ同士が重ね合わさる事になります。
後者のような状態になってはいけません。「常に手前にいるキャラクターが手前に表示されていなくてはならない」わけです。この解決方法も二つ考えられます。
A) グラフィックシステムがZレイアをサポートしている場合
B) レイアのないグラフィックシステムの場合 for i:=11 to 15 do キャラクター表示(x[i],y[i],パーツ番号i);こんなソースではダメということです。たとえばy座標が、{敵1、敵2、敵3、敵4、敵5}={7,8,6,9,5} だった場合、作画順序は敵5(y=5)→敵3(y=6)→敵1(y=7)→敵2(y=8)→敵4(y=9)と上塗りしなくてはいけません。これを実現するためには……基礎からプログラムを勉強された方はたぶん知っているでしょう、ソートのルーチンを使う必要があります。ソートには色々な種類がありますが、どうせ敵さんが5匹しかいない少ないものなので、もっとも単純と言われる選択交換法(Selection Sort)を使うことにしましょう。順番順番に隣と比べていき、相手のほうが値が小さかったらお互いを入れ替えるというものです。
……実は頭で推測して書いているだけで実際に試してないので、間違ってたらごめん(爆)。その場合、こっそり後で直しておきます(ぉ
|
まだ懸念事項はあるにはあるんですが、これは実装経験の問題もあるから、伏せておきましょう。基本的にはこれで考えるべきことは終わりました。後は、今までのアルゴリズム・ルーチンを全て統合していくだけです。次のセッション7では、はじめに中間地点版サンプルアプリを見てもらい、その解説をしていく事になるでしょう。そしてセッション8では攻撃やダメージの処理について考え、セッション9が最終目的版のサンプルアプリの紹介および解説です。終わりは見えてきましたね!
|
動く現物は今回もありませんでしたが、ゲーム製作において非常に重要な「設計」をやりました。頭にイメージだけは湧いても、これをしっかりと整理できなくては実装できません。今回の分類部分に関しては、紙に書き付けて覚えるくらいの事をした方がいいかもしれません。実際鷹月も、この後プログラムするにあたって、これらを書きつけたものを見ながら行うわけですし。 次回はそんなわけで最初に現物が出てきます。もちろんこれを書いている時点で何も作ってないし、鷹月はそれなりに忙しい身です。長くは待たせないようにはしたいと思いますが、すぐにはできません。ご了承くださいね。 また、記事の感想お待ちしています。講義というのは不特定多数にばら撒いているものではなくて、これを多少なりとも期待してくれる「特定の」人のために書いているわけですから、その特定の人が誰であるか、その存在くらいは私は把握する権利があるのだと考えます。まあ、SLG講座が一通り終わった時に、それを全部読んでくれて「ためになった」と思った時にでも構いませんので。 (毎回書いてね、ってわけじゃないんです。1度くらいはね、って意味です) - 鷹月 ぐみな |
□ Session7:ちょっと違うRPG・準備編 (2000/2/12)
|