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

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

アクションRPGの基礎(RPG2000)(応用編 敵の攻撃)

過去ブログの転載です。

ボスキャラなど、1体だけの敵が炎を放ってくるものを作ってみます。道端の敵キャラが縦横無尽に炎を放ってくるようにするには少々大変なので、とりあえず今回は、1体の敵が定期的に炎を放ってくるものを作ります。

f:id:fermiumbay13:20190801133142p:plain

炎の画像を用意しておきます。↑これはpngなので、保存した形式でインポートできます。これは4枚アニメとして再生するものですが、何でもいいですよ。

いくつかイベントを用意して、次のように作成します。

イベント「炎発射」で、敵の向いている方向に炎が出現する
  ↓
炎のイベントが現れ、当たるとダメージ
  ↓
炎のイベントが壁に当たったことが分かったら、炎を消去する

ということです。

壁に当たったかどうかの判定で一番簡単なのは「移動できない場合は無視」を利用する方法でしょうが、「指定動作の全実行」や「指定動作の全解除」の影響により、ここではうまく作れないので、苦肉の策として少々荒い方法で実現しております。

イベント「炎発射」(マップ上の見えないイベント、定期的に並列処理する)

◆ウェイト:2.0秒
◆条件分岐:変数[0022]が999999以外
 ◆変数の操作:[0141:敵:炎x]代入,EV0002のX座標
 ◆変数の操作:[0142:敵:炎y]代入,EV0002のY座標
 ◆変数の操作:[0145:敵:炎向き]代入,EV0002の向き
 ◆条件分岐:変数[0145:敵:炎向き]が2
 ◆変数の操作:[0142:敵:炎y]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0145:敵:炎向き]が4
 ◆変数の操作:[0142:敵:炎x]減算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0145:敵:炎向き]が6
 ◆変数の操作:[0142:敵:炎x]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0145:敵:炎向き]が8
 ◆変数の操作:[0142:敵:炎y]減算,1
  ◆
 :分岐終了
 ◆変数の操作:[0143:敵:炎元x]代入,変数[0141]の値
 ◆変数の操作:[0144:敵:炎元y]代入,変数[0142]の値
 ◆効果音の演奏:炎2
 ◆イベントの位置を設定:炎,(V[0141],V[0142])
 ◆スイッチの操作:[0021:敵:炎出す]をONにする
 ◆
:分岐終了

2秒おきに、敵2(ダメージ量を変数22番で管理している敵)が生きている間、その敵が向いている方向に炎が出現するようにします。ここで、炎が壁に当たったかどうかを判定するために、敵ダメージ量の初期化のときに用いた手法を使います。座標確認用の変数として、炎元x、炎元yという変数をそれぞれ用意します。

イベント「炎」

1ページ目は何もなし、ページの新規作成で2ページ目に次の内容を作る。

2ページ目(条件:スイッチ「敵:炎出す」がON、敵:炎向きが2以上)

f:id:fermiumbay13:20190801133159p:plain

◆効果音の演奏:しびれ2
◆キャラクターのフラッシュ:主人公,0.5秒(赤31緑0青0強さ31、ウェイトなし)
◆キャラクターの動作指定:主人公,ジャンプ開始,180度方向転換,一歩前進,ジャンプ終了
◆HPの増減:メンバー全員のHPを5減らす
◆キャラクターの動作指定:このイベント,グラフィック変更(fire-2)
◆イベントの位置を設定:このイベント,(000,000)
◆スイッチの操作:[0021:敵:炎出す]をOFFにする

2倍速で移動させています。当たると炎は消滅するようにするため、グラフィックの変更で透明グラフィックに変更します。fire.pngだとキャラクターの絵がないものに変更し、消えたことにします。そして、対象者探しの邪魔にならないように、(000,000)に移動させます。

移動タイプの移動ルート(動作を繰り返す、移動できない場合は無視)は、向きが2を条件としているページでは「下に移動」のみとします。2ページ目が完成したら、これは下向きの設定なので、コピーして3~5ページも作成します。それぞれのページで変えるのは条件と移動ルートのみです。条件は3、4、5ページでそれぞれ向きが4以上、6以上、8以上、とし、移動ルートはそれぞれ「左に移動」「右に移動」「上に移動」に変えます。これでOKです。炎向きの方向へ炎が2倍速で走ることになります。

ここで、2倍速で炎が走るとき1マス進むのには4/60秒掛かります。なので、壁に当たっているかどうかを判定するために4/60秒ごとに炎の位置を調べ、移動によって位置が変わっているか見ます。このとき変わっていなかったら、炎は壁に当たったと見なされるため、消去します。

ということで、イベント「炎発射」に2ページ目を作成します。

イベント「炎発射」2ページ目(条件:スイッチ「敵:炎出す」がON、定期的に並列処理する)

◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆ウェイト:0.0秒
◆変数の操作:[0141:敵:炎x]代入,炎のX座標
◆変数の操作:[0142:敵:炎y]代入,炎のY座標
◆条件分岐:変数[0143:敵:炎元x]がV[0141]と同値
 ◆条件分岐:変数[0144:敵:炎元y]がV[0142]と同値
  ◆イベントの位置を設定:炎,(000,000)
  ◆スイッチの操作:[0021:敵:炎出す]をOFFにする
  ◆
 :それ以外の場合
  ◆変数の操作:[0143:敵:元炎x]代入,変数[0141]の値
  ◆変数の操作:[0144:敵:元炎y]代入,変数[0142]の値
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆変数の操作:[0143:敵:元炎x]代入,変数[0141]の値
 ◆変数の操作:[0144:敵:元炎y]代入,変数[0142]の値
 ◆
:分岐終了

0.0秒ウェイト=1/60秒なので、4個で4/60秒です。炎の現在位置を変数に代入し、「元~」と同じかどうか調べます。完全に一致していたら動いていないということを意味するので、消去します。座標が異なる場合は動いている最中と見なせるので、「元~」に現在座標を入れます。

ちょっと荒いですが、これで一応出来るはずです。敵2からのみ炎が放たれます。放たれるだけですので、色々いじって演出など入れてみて下さい。