見出し画像

■FF4を作る #3 イベント処理

今回はかなりツクール的な内容です。(前回も…かな^^;)

イベントの配置、スクリプトの設定

 RPGでは、NPCと会話する、家の中に入る、宝箱を開けてアイテムを入手するなどのイベントがあります。

・マップエディタでイベント・スクリプトを編集

 イベントはフィールド、ダンジョンなどに配置されるため、前回作ったマップエディタに組み込みます。

イベントの配置

 上の画像は宿屋の中のマップです。
 「スクリプト設定」にチェックを入れると、壁や床などの背景ではなく、イベントを配置するモードに切り替わります。赤い枠で表示されたマスはイベントが配置されているマスで、「店員」はキャラクタータイプのイベントです。本来は店員に話しかけますが、店員とプレイヤーの間にカウンターがあるため、この場合はカウンターのマスに会話イベントを配置します(上の画像の黄色枠のマス)。

 イベントを配置したら、イベントに「スクリプト」を設定します。

会話イベントのスクリプト(画像:右側)

 スクリプトとは、「セリフを表示する」、「キャラクターを移動させる」など一連の動きをまとめたもので、上から順に実行していきます。上の画像は見ただけで何となく予想できるかもしれませんが、宿屋に泊まる時のスクリプトの内容です。画像左の「トリガータイプ」が「調べる」となっているため、カウンターに向かって決定ボタンを押すと宿屋イベントが発生します。

ベッドまで歩き、眠りにつく。おやすみ…
ステータスを全快し、いざ出発!

 スクリプトに設定した1つ1つの命令は、ゲーム本体のプログラムに「カウンターに話しかけたらウィンドウとセリフを表示して、”はい”を選んだらプレイヤーキャラを移動させて、…」という風に直接書くことでも実現はできますが、スクリプトとして別データに切り離すことで非常に管理しやすくなります。ゲーム本体のプログラム側は、スクリプトを解読して、内容を1行ずつゲームに反映する処理が必要になります。
 スクリプトはゲーム本体のプログラム側が解読できればなんでも良いので、書き方に決まりはありません。なので、スクリプトの書き方は筆者がテキトーに決めています。スクリプトの内容については記事の最後に参考までに載せておきます。

・マップ間の移動

 イベントには会話の他にマップの移動がありますね。マップ移動もこれまでに紹介したイベントと同様に配置します。
 以下はバロン城の外観のマップです。

バロン城の外観

 黄色い枠のマスにマップ移動のイベントを配置してあります。小さい扉や階段も同様です。
 城壁に設置された取っ手を調べると大きい扉が開き(非表示&当たり判定OFF)、中へ入る事が出来ます。
 黄色い枠のマップ移動イベントのスクリプトはこんな感じです。

マップ移動イベントのスクリプト

 マップ移動イベントがあるマスに移動すると、画面がフェードアウトしてマップが切り替わります。
 このマップ切り替えの時に、移動先のマップの

1.キャラのレイヤー設定
2.キャラの向きを設定
3.フェードイン

といったイベントを実行することでスムーズにマップを切り替えます。

 ちなみにスクリプトの「VISIBLE」や「ISHIT_ON」は、バロン城の中に入る際に開いた大扉を元に戻しておく(表示&当たり判定ON)処理です。この処理が無いと一度開いた大扉はずっと開きっぱなしになります(笑)

 マップの切り替えはマップの種類、移動先の座標などを資料にしておくと管理しやすくて良いですね。

マップ移動先一覧

・イベントスイッチ

 イベントはスクリプトによって実行されます。その際にイベントスイッチのON/OFFを切り替えることがあります。イベントスイッチとは俗に言うフラグのことで、例えば勇者が魔王を倒したら「魔王を倒した」というスイッチがONになり、このスイッチがONの状態で故郷に帰ると「大魔王の登場」のイベントが発生する、といった具合に、ゲームの進行に関わる分岐でスイッチが使われます。

 開発者がよくやってしまうのが「スイッチをON(OFF)にするのを忘れる」ですね…(; ・`д・´)
 これをやってしまうと本来1個限定のアイテムを無限に入手出来たり、一度倒したはずのボスと何度もバトルできてしまう事態になります。超有名タイトルですらやらかしてしまうミスです。怖い。


 次回はバトルについて書きたいと思います。


・スクリプトの内容

 主な命令はこんな感じです。
 これらを組み合わせてイベントを作っています。ご参考までに…m(_ _)m

********************************
マップ上の表示系
********************************
■向き変更
DIRECTION、向き定数、対象イベントID

■キャラを歩かせる
MOVE、向き定数(※)、歩数、非同期フラグ、対象イベントID
 非同期フラグ: 0:同期/1:非同期

※向き定数
DOWN = 0;
UP = 1;
RIGHT = 2;
LEFT = 3;

■マップ間の移動
MOVE_MAP,マップID,X座標,Y座標,イベントID
 → イベントIDに、移動先マップで実行するイベントのIDを指定する。

■イベントを指定座標に配置
POSITION、X座標、Y座標、対象イベントID

■イベントの表示/非表示切り替え
VISIBLE,表示フラグ[0:非表示/1:表示],対象イベントID

■キャラの動作を指定(腕を上げる、頷く、など)
CHARA_ACTION,キャラクターパレットのインデックス,対象イベントID

■レイヤーの切り替え
LAYER,レイヤーID[0:1:2],対象イベントID

■フェードイン、フェードアウト
FADE_IN,色,明るさを変える速さ(フレーム単位)
FADE_OUT,色,明るさを変える速さ(フレーム単位)

■メッセージ表示
MSG,SOUTH[NORTH],メッセージ内容

********************************
BGM系
********************************
■BGM再生
BGM,PLAY,BGMID,ループ[0:しない/1:する],フェード[0:しない/1:する],終了検知[0:しない/1:する]
BGM,PLAY,0,0,0,0 → 0番のBGM再生(フェードなし、終了検知なし)
BGM,PLAY,0,1,1,1 → 0番のBGMループ再生(フェードあり、終了検知あり)

■BGM停止
BGM,STOP,BGMID,停止方法[0:停止(次回再生は先頭から)/1:中断],フェード[0:しない/1:する]
BGM,STOP,0,0,0 → 0番のBGMを停止する(フェードなし)
BGM,STOP,0,1,1 → 0番のBGMを中断する(フェードあり)

********************************
制御処理系
********************************
■条件分岐
IF文によって処理を分岐する。

例)
IF,SWITCH_ON,[イベントスイッチID],真,偽
 → 指定したイベントスイッチがONの場合は真、OFFの場合は偽。
IF,SWITCH_OFF,[イベントスイッチID],真,偽
 → 指定したイベントスイッチがOFFの場合は真、ONの場合は偽。

真、偽にはスクリプト内の行数を指定する。

■スクリプトを終了する
END

********************************
その他
********************************
■一定時間(フレーム単位)何もしない
WAIT, フレーム数

■スイッチのON/OFF切り替え
SWITCH_ON,[イベントスイッチID]
 → 指定したイベントスイッチをONにする。
SWITCH_OFF,[イベントスイッチID]
 → 指定したイベントスイッチをOFFにする。

■当たり判定のON/OFF切り替え
ISHIT_ON,イベントID
 → 指定したイベントの当たり判定を有効にする。
ISHIT_OFF,イベントID
 → 指定したイベントの当たり判定を無効にする。

■アイテムの増減
ITEM,[アイテムの種類],[アイテムID],[増減数]

■イベントの実行回数の判別
IF,EXE_TIMES>[イベント実行回数],[イベントID],真,偽

■戦闘開始
BATTLE,
[戦闘背景ID],
[敵パーティID],
[戦闘終了後再生するBGMのID],
[戦闘BGMのID],
逃走可否[0:不可/1:可],
戦闘種類[0:通常/1:イベント]

■店
SHOP,[店の種類],[アイテムの種類]:[アイテムID]

・店の種類
 0:道具屋
 1:武器屋
 2:防具屋
・アイテムの種類
 0:アイテム
 1:武器
 2:盾
 3:兜
 4:鎧
 5:アクセサリー

いいなと思ったら応援しよう!