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

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

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

前回は敵がやられる演出を作っただけなので、いくら殴っても死にませんでしたが、今回はいよいよ敵にダメージを与えてみます。透明にしていく処理も兼ねて作ることにします。

敵のイベントはいま1ページにやられ処理があり、2ページに何もない状態になっていますね。その間にこれから更に2ページ追加します。1ページ目で「ページの新規作成」を2回押してください。

最終的に以下のようにします。

1ページ目(済):やられ処理
2ページ目(未):ダメージ処理
3ページ目(未):消滅処理
4ページ目(未):触ると痛い処理

4ページ目以外はどれも呼び出し専用なので、出現条件はなしです。どうしてイベント「技」でこれらのことが出来ないかというと、キャラクターの動作や位置の変更などで設定できるイベントに変数の値が使えないためです。(イベントID変数1番の敵を移動、とかができない)そのため、それぞれのイベントに処理を移し、対象を「このイベント」とすることで実装しています。

f:id:fermiumbay13:20190801132119p:plain

対象者を発見して1ページ目を呼び出したときに、その対象者IDを変数7番~9番に控えます。そして、次に2ページ目を呼び出すときに控えた変数7番~9番をもとに実行します。3ページ目も同様に扱うことができます。

今回は2ページ目を作りましょうね。

イベント「技」3ページ目

   …
   …
 ◆
:分岐終了
◆指定動作の全実行
◇イベントの呼び出し:ダメージを与える処理
◆スイッチの操作:[0001:剣を振る]をOFFにする
◆スイッチの操作:[0005:キー入力受付]をONにする

↑◇の行を追加します。当たり判定がどうであれ、ダメージを与える処理は共通部分ですので、これから技を増やす場合でも使い回しが可能です。コモンイベント「ダメージを与える処理」というものを作り、それを呼び出します。以降、イベント「技」の1ページ目以外は技を追加しない限りいじる必要がありません。

コモンイベント「ダメージを与える処理」(呼び出されたときのみ)

◆変数の操作:[0003:イベントページ]代入,2
◆変数の操作:[0010:敵番号]代入,7
◆繰り返し処理
 ◆変数の操作:[0002:対象者]代入,変数[V[0010]]の値
 ◆条件分岐:変数[0002:対象者]が0以外
  ◆イベントの呼び出し:V[2][V[3]]
  ◆
 :分岐終了
 ◆変数の操作:[0010:敵番号]加算,1
 ◆条件分岐:変数[0010:敵番号]が9より大きい
  ◆繰り返し処理の中断
  ◆
 :分岐終了
 ◆
:以上繰り返し

↑これが、敵の2ページ目を実行していく処理です。

まず、2ページ目を実行するので、変数3番「イベントページ」に2を代入します。変数7番~9番に入っているIDのイベントを呼び出すので、まず7番から順番に調べていき、9番まで終わったら繰り返し処理を中断します。

変数10番にまず7を入れ、「変数10番の番号の変数」の値を、変数2番「対象者」に入れます。ややこしいですが、最初は7が入ってるので、変数7番の値が変数2番に入ります。

そして、イベントID変数2番の変数3番ページを呼び出せば、敵イベント2ページが実行できます。

次に変数10番を1足すと8になるので、変数8番の値が変数2番に入ります。その次は9になるので、変数9番の値が変数2番に入ります。変数10番が9を超えると、繰り返し終了。

なので、当たり判定になるマスが多くなったら、この「9より大きい」を変えればいいだけになります。

ちょっとややこしいよねぇ。プログラムの疑似コード的に書くとこんな感じです。(v[n]は変数n番)

for i=7 to 9
 v[2]=v[i]
 イベント呼び出し:IDv[2]のv[3]ページ目
endfor

それでは、各イベントの2ページ目を作りましょう。また1体に戻してくださいね。作り終わったら複製してください。

敵の2ページ目

◆変数の操作:[0002:対象者]加算,20
◆変数の操作:[V[0002]]加算,1

まずはこう。敵のダメージ量を管理している変数は、「20+対象者ID」番の変数でしたから、まず変数2番「対象者」を20足します。そして、その番号の変数をダメージ分だけ加算すれば、敵のダメージ量が加算されます。↑ここで1としているのは、「1ダメージ」ということです。強力な攻撃であれば大きくしたり、攻撃力や防御力の概念を作ってダメージの計算結果の値だけ加算する、などというRPGっぽいことももちろんできます。定数の1ではなく、変数の「ダメージ」というものを作るのもいいかもしれませんね^^ 変数2番「対象者」は呼び出しに使っただけなので、20減算して戻す必要はありません。

さてこれだけではわざわざ敵のイベントを呼び出した意味がありませんので、消滅していく処理を追加します。↓◇の行を追加しますね。

◆変数の操作:[0002:対象者]加算,20
◆変数の操作:[V[0002]]加算,1
◇変数の操作:[0011:敵ダメージ量代入用]代入,変数[V[0002]]の値
◇条件分岐:変数[0011:敵ダメージ量代入用]が3以上
 ◇変数の操作:[V[0002]]代入,999999
 ◇効果音の演奏:消滅2
 ◇条件分岐:このイベントが上を向いている
  ◇キャラクターの動作指定:このイベント,※
  ◇
 :分岐終了
 ◇条件分岐:このイベントが右を向いている
  ◇キャラクターの動作指定:このイベント,※
  ◇
 :分岐終了
 ◇条件分岐:このイベントが下を向いている
  ◇キャラクターの動作指定:このイベント,※
  ◇
 :分岐終了
 ◇条件分岐:このイベントが左を向いている
  ◇キャラクターの動作指定:このイベント,※
  ◇
 :分岐終了
 ◇
:それ以外の場合
 ◇変数の操作:[V[0010]]代入,0
 ◇
:分岐終了

※の部分は後述です。

HPが3の敵とします。ダメージ量が3以上になれば倒したことになるので、ダメージ量が3以上だと条件分岐の中に入れるようにします。条件分岐に変数番目の変数が使えないので、やむなく変数11番に一度代入してから参照しています。

消滅の演出をするときに、次いで倒れた証としてダメージ量を999999にします。変数2番の番号の変数に999999を代入すればいいですね。次は演出です。効果音をてきとうに鳴らし、徐々に透明にしていきます。徐々に透明にする方法は色々ありますが、一例です。上を向く場合の※は次のようになるでしょう。

動作指定:上を向くの場合(頻度6)

◇すり抜け開始
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く
◇透明度アップ
◇上を向く

透明度は7段階あるので、7回透明度アップして上を向かせます。他の方向の場合は「上を向く」の所だけその方向にすればいいだけです。これは苦肉の策であり、仕方がないのです。透明度アップしてウェイト、アップしてウェイト、を7回やるだけの話なのですが、このちょっとのウェイトを行う命令が低頻度時の向き変更しかないのです。「一時停止」は1/3秒ウェイトする命令です。とてもじゃないけど長いです。指定動作とは別にウェイトを挟みながら動作指定を7回行うことでも作れますが、ウェイト中に敵が動くことがあるので、敵のランダム移動を止める必要があります。

f:id:fermiumbay13:20190801132149p:plain

頻度6で1段階透明にすると1/15秒ずつかかります。よって、7段階透明にするまでに0.5秒足らず掛かることになります。もっと速くするには頻度7に、遅くするには頻度5にすると良いでしょう。それより遅くしたいなら「一時停止」を使えば良いと思います。

消滅の演出後、イベントの座標を(000,000)に移動させる必要がありますから、それを3ページ目にそれを作成し、実行させます。当然倒れた敵のみ実行します。倒れていない、関係ないイベントは実行させないため、ダメージによって倒れなかった場合は対象者のリストから外します。変数7番~9番のどれを扱っているかを管理しているのは変数10番でしたから、変数10番の番号の変数に0を代入します。こうすれば、次に3ページ目を呼び出すときに、倒れていない敵は呼び出されません。

最後に、透明度アップの動作を待つため「指定動作の全実行」を入れましょう。

コモンイベント「ダメージを与える処理」

   …
   …
  ◆
 :分岐終了
 ◆
:以上繰り返し
◇指定動作の全実行

↑最後の行に「指定動作の全実行」を追加します。

これで、敵に3回ダメージを与えると消滅する処理ができました。しかしまた完全には消滅しません。透明度7の薄い敵が残るのが確認できるでしょう。攻撃は当たりませんが、透明なだけの敵がウロウロするようになると思います。これは他の敵を対象者として殴るときに判定の邪魔になるので、次回で完全に敵を消滅させてみますね。