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

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

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

前回は剣を振る所まで作ったので、今度は実際に敵を置いて、剣が敵に当たったらその敵のイベントIDを取得してメッセージを返すようにしてみます。

マップでイベントを設置すると、そのイベントにユニークなIDが設定されます。初めて置いたら1番。次に置いたら2番、……となっていきます。これがイベントIDです。イベントIDは、イベントエディタのタイトルバーを見れば分かります。

f:id:fermiumbay13:20190801130750p:plain

作りたてのイベントの名前はイベントIDに準拠したものになっています。

例えばツクール95ではイベントIDはゲーム通しですべて異なるものになっていたためイベントIDが1000番とか2000番とかいうのがざらにありますが、ツクール2000ではマップごとに区別されているため、新しくマップを作ってそこにイベントを置くと、イベントIDは1番になります。

前回作っておいたイベント「技」は、当然1番ですね。イベントを削除するなどによって、欠番IDを作ることもできますが、メリットは普通ありません。

具体的には次のような方法で、敵のイベントIDを返すことにしましょう。

剣を振ったら、向きに応じて当たり判定のあるマスのイベントIDを調べる
 ↓
取得したイベントIDが「敵」のものであれば、そのイベントIDを返す
 ↓
当たり判定のあるマスすべてを調べ終わるまでくりかえし

そのマスのイベントIDを調べる命令に「指定位置のイベントID取得」がありますので、それを利用します。「指定位置のイベントID取得」をして番号が「敵」のものであれば、イベントIDを返します。

そのイベントIDが「敵」のものかどうかの判断は、作成者がするしかありません。回復アイテムを斬れたらおかしいですものね。

とりあえず敵を置いてみましょう。スライムにします。

f:id:fermiumbay13:20190801130814p:plain

ウロウロするだけ。イベントIDは2番になっていますね。つまり「指定位置のイベントID取得」でイベントID2番が取得されたら、2を返すようにします。

まず、剣を下向きに振ったときの処理だけを作りましょう。当たり判定は何でもいいのですが、例として次の位置を当たり判定とします。

f:id:fermiumbay13:20190801130836p:plain

主人公の前3マス。例でこうしているだけで、マスの位置も数もなんでもいいです。

↑この黄色い部分のマスの座標で「指定位置のイベントID取得」をしたとき、イベントID2番が取得されたら、そこに敵がいるということになります。

黄色い部分の座標を調べるにはどうすればいいでしょう? 主人公依存の座標ですので、主人公の座標が分かれば求められます。主人公の座標は前回のイベント「キー入力」で取得するように設定しましたね。

変数4番「攻撃x」、変数5番「攻撃y」に、それぞれ主人公の座標が入っています。左側の黄色いマスの座標を調べるには、主人公の位置から左へ1マス、下へ1マス行けば良いですから、「攻撃x」を1引いて、「攻撃y」を1足せば、左側の黄色いマスの座標になります。その位置で「指定位置のイベントID取得」をすればOKです。
同様に、真ん中の黄色いマスを調べたければそこから右へ1マス行けばいいので、「攻撃x」を1足して「指定位置のイベントID取得」をし、右側の黄色いマスを調べたければ、更にそこから右へ1マス行けばいいので、「攻撃x」をまた1足して「指定位置のイベントID取得」をすればOKです。なんだかパズルみたいでしょう。もちろん右側からやっても当然OKですよ。

実際にイベントを組んでみると、こんな感じに……イベント「技」1ページ目の向きが2のときの所のみ。「指定位置のイベントID取得」によって取得されたイベントIDを格納する変数は、変数2番「対象者」というものにしています。

◆条件分岐:変数[0006:向き]が2
 ◆戦闘アニメの表示:剣↓,主人公
 ◇変数の操作:[0004:攻撃x]減算,1
 ◇変数の操作:[0005:攻撃y]加算,1
 ◇指定位置のイベントID取得:(V[0004],V[0005]),[0002:対象者]
 ◇条件分岐:変数[0002:対象者]が2
  ◇文章:\V[2]
  ◇
 :分岐終了
 ◇変数の操作:[0004:攻撃x]加算,1
 ◇指定位置のイベントID取得:(V[0004],V[0005]),[0002:対象者]
 ◇条件分岐:変数[0002:対象者]が2
  ◇文章:\V[2]
  ◇
 :分岐終了
 ◇変数の操作:[0004:攻撃x]加算,1
 ◇指定位置のイベントID取得:(V[0004],V[0005]),[0002:対象者]
 ◇条件分岐:変数[0002:対象者]が2
  ◇文章:\V[2]
  ◇
 :分岐終了
 ◆
:分岐終了

↑◇から始まる命令が、前回から追加した分です。まぁ……言いたいことは分かりますよね。しかし長いしややこしいです。対象者が2番だけじゃなくて、3番とか4番とか増えたらいちいちこれらを変更しなきゃいけないのかと思うと、なかなか面倒です。

イベントIDを取得して、それが「敵」のものかどうかを判断するのはどのマスでも共通のことですから、なんとか簡単化したいものです。しかし、イベントIDはマップによって異なるので、コモンイベントにまとめるわけにもいきません。マップイベントにまとめたいですが、かと言ってそれ専用に新たにイベントを作るとなると、新しいマップを作るたびに2つのイベントをコピーしなければなく、めんどくさくなります。

それなら、イベント「技」で済ませてしまいましょう。

イベントのページを活用します。例えば宝箱を作るときに1ページ目がしまった宝箱、2ページ目があいた宝箱とします。1ページ目にお宝を入手するイベントを作って、宝箱を開けたというスイッチをONし、そのスイッチがONになっていると2ページ目になるようにすれば、実現できます。スイッチがOFFだと2ページ目の条件が満たされないので1ページ目へ、スイッチがONだと2ページ目の条件が満たされているので2ページ目へ、となります。条件が満たされているかどうかは、ページ番号の高いものから調べられていきます。(バトルイベント(デフォルト戦闘中のイベント)は逆にページ番号の低いものから調べられます)

f:id:fermiumbay13:20190801130907p:plain

それを利用すれば、↑このようなこともできます。剣を振るというスイッチがOFFならば、3ページ目は実行されず、2ページ目が実行されます。スイッチがONならば、3ページ目の条件が満たされているので、3ページ目が実行されます。いずれの場合でも、1ページ目は実行されません。

この1ページ目のようなページをどうすれば実行出来るかというと、「イベントの呼び出し」をすれば実行出来ます。コモンイベントの開始条件「呼び出されたときのみ」のイベントと全く同じ扱いが出来るのです。

というわけで、これまでのイベント内容は3ページ目に移行して、イベントIDの取得をする処理は1ページ目に作り、それを呼び出すようにしましょう。イベント「技」で「ページの新規作成」を2回押して、2つページを作ってください。どちらもイベント開始条件は「決定キーが押されたとき」にしておいてください。

f:id:fermiumbay13:20190801131006p:plain

ページを入れ替えるコマンドはないので、コピーして貼り付けする方法をします。1ページ目で「ページのコピー」を押して「ページの削除」で削除し、2ページ目を選んで「ページの貼り付け」をすれば、3ページ目に移行します。これでこれまでの処理は3ページ目に移行しました。2ページ目には手を付けません。1ページ目に、実行内容だけ次のようなものを入れます。

◆指定位置のイベントID取得:(V[0004],V[0005]),[0002:対象者]
◆条件分岐:変数[0002:対象者]が2
 ◆文章:\V[2]
 ◆
:分岐終了

↑さっきの処理での重複部分です。そして、3ページ目の向きが2のときの所をこのように改変します。

◆条件分岐:変数[0006:向き]が2
 ◆戦闘アニメの表示:剣↓,主人公
 ◆変数の操作:[0004:攻撃x]減算,1
 ◆変数の操作:[0005:攻撃y]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0004:攻撃x]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0004:攻撃x]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆
:分岐終了

↑このイベントの1ページ目を呼び出すようにさせれば、1ページ目の処理が行われるというわけです。対象者が増えても、1ページ目だけを弄れば良いことになります。

この調子で他の3方向の処理も作っておきましょう。このようになります。

◆条件分岐:変数[0006:向き]が2
 ◆戦闘アニメの表示:剣↓,主人公
 ◆変数の操作:[0004:攻撃x]減算,1
 ◆変数の操作:[0005:攻撃y]加算,1
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0004:攻撃x]加算,1
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0004:攻撃x]加算,1
 ◆イベントの呼び出し:このイベント[1]
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が4
 ◆戦闘アニメの表示:剣←,主人公
 ◇変数の操作:[0004:攻撃x]減算,1
 ◇変数の操作:[0005:攻撃y]減算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0005:攻撃y]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0005:攻撃y]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が6
 ◆戦闘アニメの表示:剣→,主人公
 ◇変数の操作:[0004:攻撃x]加算,1
 ◇変数の操作:[0005:攻撃y]減算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0005:攻撃y]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0005:攻撃y]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が8
 ◆戦闘アニメの表示:剣↑,主人公
 ◇変数の操作:[0004:攻撃x]減算,1
 ◇変数の操作:[0005:攻撃y]減算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0004:攻撃x]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◇変数の操作:[0004:攻撃x]加算,1
 ◇イベントの呼び出し:このイベント[1]
 ◆
:分岐終了
◆スイッチの操作:[0001:剣を振る]をOFFにする
◆スイッチの操作:[0005:キー入力受付]をONにする

↑この処理はお好みで設定してくださいね。一度これを設定してしまえば以後3ページ目は触る必要がなくなり、新たに敵を置いたら1ページ目だけを変えれば良いことになるので、作業効率が上がります。試しに敵を数体増やして、1ページ目を変えてみてください。ふつうイベントIDは連番で決まるので、敵以外のイベントを置くまでは条件分岐の所を2以上にしておいていいと思います。

1ページ目

◆指定位置のイベントID取得:(V[0004],V[0005]),[0002:対象者]
◇条件分岐:変数[0002:対象者]が2以上
 ◆文章:\V[2]
 ◆
:分岐終了

うん、この方が良さそうですねぇ。実行すると、殴った敵のイベントIDが表示されるはずです。これは、イベントID2番以降は全部敵ですよ、っていう意味ですよ。10番だけは敵じゃない! とするなら、2以上9以下にして、11以上をまた敵にすればいいですね。

ちょっと長かったけど、かなりそれっぽくなってきましたね。次回は殴った敵にダメージを与える処理を作ってみましょう。更にややこしいですが、だいじょうぶ。