RPGツクールと数学のブログ

RPGツクールと数学についてのブログです。

アクションRPGの基礎(RPG2000)(1/7)

過去ブログの転載です。

RPGツクール2000アクションRPGサンプルです。全7回です。

(1/7) アルゴリズムを考える
(2/7) 剣を振る
(3/7) 対象者を発見する
(4/7) 敵の動作やHPの管理について
(5/7) 敵を吹っ飛ばす
(6/7) 敵にダメージを与える
(7/7) 敵を完全に消滅させる

フィールド上の敵を、技を使って倒すゲームの基礎です。基礎だけ作ってしまえば後は作者さんのセンスで何とでもできます。

今回は仕組みだけを紹介します。次のように敵と戦う仕組みを導入することによって、アクションRPGの基礎ができあがるでしょう。

「攻撃」によって対象者を探す
  ↓
攻撃が当たった敵にダメージを与える
  ↓
敵に与えたダメージ量が既定値に達したら敵を消滅させる

敵に与えたダメージ量を記憶するものといえば「変数」で、ダメージを与えると変数の値が変わり、敵のHP分ダメージが与えられると、敵は消滅する。消滅したかどうかの判定は「スイッチ」が良いかなあ……? などと考えられます。

しかしここで、ツクール2000における仕様の壁に当たります。

① 配列変数が使えない
② 条件分岐で使える「スイッチ」の番号に変数は指定できない
③ 一時消去しても敵の存在は残る

①は仕方ありません。しかし配列変数がなくて困ることは、「敵のHPの管理」が難しくなることです。たくさん敵がいる場合は、その都度敵HPの変数を増やしていかなきゃなりません。なんとかラクに作りたいものです。

変数の操作では、「変数番目の変数」を操作することが可能です。例えば変数1番の値が「5」だとすると、「変数1番の番号の変数」に「7」を代入したら、変数5番に7が入ります。これを利用すると、複数の変数に同時に値を代入したり、任意の番号の変数を参照することが出来るようになります。

例えば変数101番~変数200番までを敵のHPとして管理すると決めれば、「攻撃」することで見つけた敵の番号+100番目の変数を操作すれば、攻撃された敵のHPをいじったことになります。

これで①の問題は解決したでしょう。

②はなかなか大きな問題です。敵を倒した判定は「スイッチ」で行えば良いと言えばそうなのですが、任意の番号のスイッチがONかどうかを調べることが出来ないのです。

これでは結局敵を追加するたびに、「1番の敵を倒した」「2番の敵を倒した」……と、ONするスイッチをひたすら設定していかなければなりません。まあ、設定すればいい話なのですが、やっぱりラクに作りたいです。

そういえば、①の問題で提示した「変数」は、「変数番目の変数」をいじることが可能でした。これによって、任意の番号の変数がどんな値なのかを条件分岐で調べることも可能になります。

「スイッチ」と「変数」の違いは、ON、OFFの2択か-999999~999999の数値かの違いです。中に入るモノが違うだけなんですよね。それなら「変数」に統一してしまえば良いでしょう。例えば敵を倒したら、その敵のHPを-999999にしてしまうのです。
すると、もしHPが-999999なら敵は倒している、それ以外の値ならまだ生きている、と分岐できます。倒したかどうかの判定も、スイッチじゃなくて変数で管理するようにすれば可能なのです。これなら②も解決しそうです。

③は地味にいやらしい仕様です。敵を倒したら、「イベントの一時消去」という命令をすればそのマップにいる間はイベントが消えるので、敵を消滅させることができます。しかし、形だけは消滅していても、実はそのマスには敵の存在だけは残っているのです。そのため、そのマスのイベントIDを取得したときにすでに倒した敵のIDが誤って取得されてしまい、生きている敵にダメージを与えられないという事態が発生する可能性があります。

どうすれば解決できるかですが、簡単なことです。端に追いやってしまえば良いのです。敵が消滅する処理のとき、「イベントの位置を設定」でそのイベントを例えば座標(000,000)に移動させてから一時消去すれば、その敵の存在は確かに残りますが、端にいるので生きている敵と重なることが少なくなります。座標(000,000)に障害物でも置いておけば、ぜったい敵と重なることはなくなるでしょう。この座標はもちろん好きな場所でいいです。私はいつも(000,000)にしてます。

以上で仕様の問題は解決しました。これなら作れそうですね。

次回から早速、「攻撃」を作っていきます。敵にダメージを与える手段のことです。初めはきっと、とても簡単です^^;