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

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

アクションRPGの基礎(RPG2000)(応用編 ビーム)

過去ブログの転載です。

ビームを放ってみましょう。向いている方向の直線上にいる敵にダメージを与えます。
Escを押すと放てるようにしてみますねぇ。

コモンイベント「キー入力(ビーム)」(定期的に並列処理する、「キー入力受付」がON)

◆キー入力の処理:[0001:キー入力:値](6のみチェック、キーが押されるまで待つON
◆現在の場所を記憶:[0006],[0004],[0005]
◆変数の操作:[0006:向き]代入,主人公の向き
◆スイッチの操作:[0010:ビーム]をONにする
◆スイッチの操作:[0005:キー入力受付]をOFFにする)

剣とほぼ同じです。技の内容とキーが違うだけです。Escを押すとビームを放つことを意味するスイッチがONになり、キー入力受付がOFFになります。

ビームは画面をはみ出してずっと向こうの敵にも攻撃することが可能ですが、ここでは向いている方向20マスまでを限界とします。画面内にいる敵のみビーム有効、とすることも可能ですが、ここでは省略します。20マス同時に判定するので、コモンイベント「ダメージを与える処理」にある2つの

◆条件分岐:変数[0010:敵番号]が108より大きい

108を、それぞれ120に増やしてください。それだけです。

イベント「技」新規ページ(出現条件:「ビーム」がON  開始条件:定期的に並列処理する)

◆変数の操作:[0012:ダメージ]代入,3
◆変数の操作:[0101~0120]代入,0
◆変数の操作:[0010:敵番号]代入,101
◆指定動作の全解除
◆変数の操作:[0016:ビーム進む残りマス数]代入,20
◆条件分岐:変数[0006:向き]が2
 ◆戦闘アニメの表示:ビーム↓,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が4
 ◆戦闘アニメの表示:ビーム←,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が6
 ◆戦闘アニメの表示:ビーム→,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が8
 ◆戦闘アニメの表示:ビーム↑,主人公
 ◆
:分岐終了
◆繰り返し処理
 ◆条件分岐:変数[0006:向き]が2
  ◆変数の操作:[0005:攻撃y]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が4
  ◆変数の操作:[0005:攻撃x]減算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が6
  ◆変数の操作:[0005:攻撃x]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が8
  ◆変数の操作:[0005:攻撃y]減算,1
  ◆
 :分岐終了
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0016:ビーム進む残りマス数]減算,1
 ◆条件分岐:変数[0016:ビーム進む残りマス数]が0以下
  ◆繰り返し処理の中断
  ◆
 :分岐終了
 ◆
:以上繰り返し
◆指定動作の全実行
◆イベントの呼び出し:ダメージを与える処理
◆スイッチの操作:[0005:キー入力受付]をONにする
◆スイッチの操作:[0010:ビーム]をOFFにする

長いけど、やってることはシンプルです。初めの数行は定型です。ダメージは今回は3にしましたので、スライムは一発で死にます。戦闘アニメはなんでもいいです。ウェイトも入れても入れなくても……定期的に並列処理でウェイトを入れると、歩きながら戦闘アニメが表示され、それが終わった瞬間にダメージ判定が始まります。それを防ぎたい場合は、自動的に始まるにすると良いでしょう。

原理は、変数「ビーム進む残りマス数」に初め20を代入し、1マス進んで対象者探しするごとにそれを1減算していき、0以下になるまで繰り返すというものです。

向いている方向へ、攻撃x、攻撃yが加減し、1マス進むごとに1ページ目を呼び出して、対象者探しを行います。これを20マス繰り返したら終了というわけです。

ただ、これではビームはすべての壁を貫通してしまうので、それでも良い場合はこれで完成ですが、壁は貫通しないようにしたい場合、地形を利用することで実現できます。

地形とは、データベースの欄にある通り、草原や森などそれぞれのマップチップ固有で決められているものとなっています。普通は敵とエンカウントしたときに、地形によって背景が変わるというのを実現したり、森に入って足元が透けて表示するようにしたりすることに用いるものです。イベント命令には指定位置の地形IDを取得するものがありますから、壁となるマップチップの地形を例えば「壁」という地形にするなどして、対象者探しを行っているときにその地形IDに当たったら攻撃を強制終了する、とすればOKです。

ここでは初めからある地形ID1番の「草原」でない地形に当たった場合対象者探しを中断する、というシステムにしてみます。

f:id:fermiumbay13:20190801133331p:plain

試しに海を置きました。海は「草原」ではないので、ビームは海を越えることはできません。

   …
   …

 ◆条件分岐:変数[0006:向き]が8
  ◆変数の操作:[0005:攻撃y]減算,1
  ◆
 :分岐終了
 ◇指定位置の地形ID取得:(V[0004],V[0005]),[0017:地形ID]
 ◇条件分岐:変数[0017:地形ID]が1以外
  ◇繰り返し処理の中断
  ◇
 :分岐終了
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0016:ビーム進む残りマス数]減算,1
 ◆条件分岐:変数[0016:ビーム進む残りマス数]が0以下
  ◆繰り返し処理の中断
  ◆
 :分岐終了
 ◆
:以上繰り返し
◆指定動作の全実行
◆イベントの呼び出し:ダメージを与える処理
◆スイッチの操作:[0005:キー入力受付]をONにする
◆スイッチの操作:[0010:ビーム]をOFFにする

↑さっきの技イベントに、◇の行を追加してください。攻撃x、yの座標の地形IDを調べて、変数17番「地形ID」に代入します。それが草原(=1番)でなければ、繰り返し処理を中断します。これで海を越えないビームのできあがり。

山のチップはデフォルトでは草原の地形になっているので、山は越えてしまいます。アクションゲームを作る場合、地形の戦闘背景などはほとんど関係ないので、地形は簡素に「通行可」「通行不可」「ビーム通行可」「足元透過」とか、地形の性質を直接表す名前にして、少数の地形にした方が扱いやすいでしょう。

今度は敵がビームを放ってくるやつを作ってみます。