RPGツクールMVでゼルダの伝説・聖剣伝説風のアクションRPGを作る方法

RPGツクールMVで、ゼルダの伝説や聖剣伝説風(ファミコン・スーパーファミコン)のシンプルなトップビュー型アクションRPGを作るための方法です。

  • 決定ボタンを押すと、キャラクターが武器を振れるようにする。
  • 『スイッチ』『コモンイベント』『変数』『セルフスイッチ』を活用する。
  • 一部、JSのスクリプトを書くことが必要になる。

「コモンイベント」とは、ゲーム中ならいつでも実行できるイベントのこと。コモンイベントは、マップ上、バトル中などを問わずいつでもイベントの実行ができる
コモンイベントは、『データベースのコモンイベントタブ』で作成できます。

  • スイッチの作り方

1.初期化処理とマップの作成

  • 初期設定用のマップを作る。マップ名は「初期設定」とする。
  • 実際にプレイヤーが動くマップを作る。マップ名は「マップ」とする。
  • 主人公の初期位置は、何もないマップ「初期設定」にする。
  • データベースのシステムタブを開き、初期パーティ欄に入力されているキャラクター名を削除する。
  • 「初期設定」マップに、イベントを作成する。トリガーは「自動実行」。実行内容は、下記の通り。
◆画面のフェードアウト
◆メンバーの入れ替え:ハロルドを加える
◆場所移動:マップ (8,6)
◆画面のフェードイン
  • これでゲームを起動すると、黒い画面が出た後、プレイヤーが「マップ」に表示されるようになる。

2.キー操作で剣を振れるようにする

  • データベースの「アニメーション」タブを開き、剣を振るアニメーションを追加する。アニメーションは元プロジェクトからコピーした。
  • スイッチ1番「キー入力受付」を用意する。スイッチの新規作成は、データベース、コモンイベントのスイッチ欄をクリックするとできる。
  • 初期設定マップで、スイッチ1番「キー入力受付」をONにする。
◆画面のフェードアウト
◆メンバーの入れ替え:ハロルドを加える
◆スイッチの操作:#0001 キー入力受付 = ON
◆場所移動:マップ (8,6)
◆画面のフェードイン
  • データベースの「コモンイベント」タブを開き、キー入力受付用のコモンイベントを作る。コモンイベント名は「キー入力受付」とする。
◆条件分岐:ボタン[決定]が押されている
  ◆条件分岐:決定キー押してる時間 = 0
    ◆スイッチの操作:#0002 剣を振る = ON
    ◆
  :分岐終了
  ◆変数の操作:#0001 決定キー押してる時間 += 1
  ◆
:それ以外のとき
  ◆変数の操作:#0001 決定キー押してる時間 = 0
  ◆
:分岐終了
  • コモンイベント「剣を振る」を新たに作る。トリガーは並列処理、出現条件はスイッチ2番「剣を振る」がONです。
◆条件分岐:プレイヤーが下を向いている
  ◆アニメーションの表示:プレイヤー, 剣↓
  ◆
:分岐終了
◆条件分岐:プレイヤーが左を向いている
  ◆アニメーションの表示:プレイヤー, 剣←
  ◆
:分岐終了
◆条件分岐:プレイヤーが右を向いている
  ◆アニメーションの表示:プレイヤー, 剣→
  ◆
:分岐終了
◆条件分岐:プレイヤーが上を向いている
  ◆アニメーションの表示:プレイヤー, 剣↑
  ◆
:分岐終了
◆ウェイト:15フレーム
◆スイッチの操作:#0002 剣を振る = OFF
  • これで、ゲームを実行し、決定ボタン(Enter)を押すと、プレイヤーが剣を振るようになった。

3.敵を用意する

  • マップ上にランダムに動き回る敵を配置する。
名前:こうもり
メモ:[対象者]
画像:正面画像
自律移動
 タイプ:ランダム
  速度:4標準速
  頻度:3標準
オプション
 歩行アニメ:チェックを入れる
足踏みアニメ:チェックを入れる

プライオリティ:通常キャラと同じ
   トリガー:決定ボタン
  • 「対象者取得」のコモンイベントを作成する。コモンイベントの実行内容は下記の通り。
◆指定位置の情報取得:対象者ID, イベントID, ({攻撃X},{攻撃Y})
◆条件分岐:対象者ID ≠ 0
  ◆文章:なし, ウィンドウ, 下
  :  :\>対象者は\V[4]番だよ!
  ◆
:分岐終了
  • 変数を作成する。2番を「攻撃X」、3番を「攻撃Y」、4番を「対象者ID」とする。
  • コモンイベント「剣を振る」の実行内容を以下のように書き換える。
◆変数の操作:#0002 攻撃X = プレイヤーのマップX
◆変数の操作:#0003 攻撃Y = プレイヤーのマップY
◆条件分岐:プレイヤーが下を向いている
  ◆アニメーションの表示:プレイヤー, 剣↓
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが左を向いている
  ◆アニメーションの表示:プレイヤー, 剣←
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが右を向いている
  ◆アニメーションの表示:プレイヤー, 剣→
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが上を向いている
  ◆アニメーションの表示:プレイヤー, 剣↑
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆ウェイト:15フレーム
◆スイッチの操作:#0002 剣を振る = OFF
  • コモンイベント「対象者取得」に、「対象者」であるかどうかの判定をするスクリプトを1行追加する。
◆指定位置の情報取得:対象者ID, イベントID, ({攻撃X},{攻撃Y})
◆条件分岐:対象者ID ≠ 0
  ◆条件分岐:スクリプト:~$dataMap.events[$gameVariables.value(4)].note.indexOf("[対象者]")
    ◆文章:なし, ウィンドウ, 下
    :  :\>対象者は\V[4]番だよ!
    ◆
  :分岐終了
  ◆
:分岐終了
  • マップに、犬を置く。この犬には、メモに[対象者]と入れない。
  • ゲームを実行する。こうもりの近くで決定ボタンを押し攻撃すると対象者IDのメッセージが表示されるが、犬の近くで攻撃をしても対象者IDのメッセージが表示されないことを確認する。
  • これで、敵キャラクターとそうでないキャラクターの判別ができるようになった。

4.敵にダメージを与えられるようにする

  • コモンイベント「対象者取得」を以下のように書き換える。
◆指定位置の情報取得:対象者ID, イベントID, ({攻撃X},{攻撃Y})
◆スクリプト:var targetID = $gameVariables.value(4);
:     :if(targetID != 0 && ~$dataMap.events[targetID].note.indexOf("[対象者]")){
:     : var mapID = this._mapId;
:     : if(!$gameSelfSwitches.value([mapID, targetID, "B"])){
:     :  $gameSelfSwitches.setValue([mapID, targetID, "A"], true);
:     : }
:     :}
  • 敵キャラを選択し、「EVページ作成」ボタンを押し2ページ目を作る。内容は以下の通りにする。
出現条件
 セルフスイッチ:A
トリガー:並列処理
プライオリティ:通常キャラと同じ
画像:敵の正面画像を入れる
オプション
  歩行アニメ:チェックを入れる
 足踏みアニメ:チェックを入れる
実行内容:

◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度:5
:        :◇プレイヤーの逆を向く
:        :◇一歩前進
:        :◇一歩前進
:        :◇移動速度:3
◆セルフスイッチの操作:A = OFF
  • ここまでやって、ゲームを実行し、敵を攻撃すると、赤く光るようになることが確認できる。次は、実際に敵にダメージを与える処理を追加する。
  • マップ「初期設定」にある「起動時の初期化イベント」を下記のように書き換える。
◆画面のフェードアウト
◆メンバーの入れ替え:プレイヤーを加える
◆スクリプト:enemyDamage = new Array(999);
:     :for(var i = 0; i < 999; i++){
:     : enemyDamage[i] = 0;
:     :}
◆スイッチの操作:#0001 キー入力受付 = ON
◆場所移動:バトルフィールド (8,6)
◆画面のフェードイン
  • バトルフィールドマップにある敵キャラのイベントエディタを開き、2ページ目の実行内容を下記のように書き換える。
◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度:5
:        :◇プレイヤーの逆を向く
:        :◇一歩前進
:        :◇一歩前進
:        :◇移動速度:3
◆スクリプト:enemyDamage[this.character(0)._eventId - 1] += 1;
◆条件分岐:スクリプト:enemyDamage[this.character(0)._eventId - 1] >= 3
  ◆SEの演奏:Explosion1 (90, 100, 0)
  ◆移動ルートの設定:このイベント (ウェイト)
  :        :◇すり抜けON
  :        :◇不透明度:230
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:204
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:179
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:153
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:128
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:102
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:77
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:51
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:26
  :        :◇ウェイト:5フレーム
  ◆イベントの位置設定:このイベント, (0,0)
  ◆セルフスイッチの操作:B = ON
  ◆
:分岐終了
◆セルフスイッチの操作:A = OFF
  • 敵のイベントエディタを開き、「EVページ作成」ボタンを押し3ページ目を新たに作る。以下の内容のとおりにする。その他は標準設定のままでいい。
出現条件
 セルフスイッチ:B
画像:なし
  • ゲームを実行し、敵キャラに3回攻撃をすると、敵が消滅することが確認できる。これで攻撃をすると、敵キャラクターが倒せる状態になりました。

5.敵からダメージを受けるようにする

  • 敵キャラクターのイベントエディタを開き、1ページ目の実行内容を以下のようにする。
◾トリガー
イベントから接触

◾実行内容
◆条件分岐:決定キー押してる時間 = 1
  ◆イベント処理の中断
  ◆
:分岐終了
◆SEの演奏:Damage1 (90, 100, 0)
◆アニメーションの表示:プレイヤー, ダメージ
◆移動ルートの設定:プレイヤー (飛ばす, ウェイト)
:        :◇180度回転
:        :◇一歩前進
◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
  • これでゲームを実行し、プレイヤーが敵に当たると50ポイントのダメージを受けるようになる。

6.ダメージを受ける処理を少し変えてみる(ゲーム難易度調整)

敵から連続でダメージを受けるのを防ぐため、一度ダメージを受けたら一定時間プレイヤーが無敵になる処理を加える。

  • スイッチ3番「主人公被ダメージ無敵」を新たに作る。スイッチの作り方は、データベースからコモンイベントを開き、スイッチ欄をクリックすると、スイッチの選択ウィンドウが表示されるので、ここでスイッチの新規作成ができる。
  • 敵キャラクターのイベントエディタを開き、実行内容を以下に書き換える。
◆条件分岐:決定キー押してる時間 = 1
  ◆イベント処理の中断
  ◆
:分岐終了
◆条件分岐:主人公被ダメージ無敵がON
  ◆イベント処理の中断
  ◆
:分岐終了
◆SEの演奏:Damage1 (90, 100, 0)
◆アニメーションの表示:プレイヤー, ダメージ
◆移動ルートの設定:プレイヤー (飛ばす, ウェイト)
:        :◇180度回転
:        :◇一歩前進
◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
◆スイッチの操作:#0003 主人公被ダメージ無敵 = ON
  • コモンイベント「主人公被ダメージ無敵」を以下のように作る。
◾トリガー
並列処理
◾スイッチ
0003:主人公被ダメージ無敵
◾実行内容
◆ウェイト:30フレーム
◆スイッチの操作:#0003 主人公被ダメージ無敵 = OFF
  • これでゲームを実行し、敵キャラクターにあたりダメージを受けている瞬間(0.5秒間)は、追加のダメージを受けることがなくなる。

7.初期化処理のまとめ

  • コモンイベント「初期化」を以下のように新たに作る。
◾名前
 初期化

◾トリガー
 なし

◾実行内容
◆スクリプト:enemyDamage = new Array(999);
:     :for(var i = 0; i < 999; i++){
:     : enemyDamage[i] = 0;
:     :}
◆スクリプト:for(var eventID = 1; eventID <= 999; eventID++){
:     : var mapID = this._mapId;
:     : $gameSelfSwitches.setValue([mapID, eventID, "A"], false);
:     : $gameSelfSwitches.setValue([mapID, eventID, "B"], false);
:     :}
◆スイッチの操作:#0001 キー入力受付 = ON
◆スイッチの操作:#0003 主人公被ダメージ無敵 = OFF
  • マップ「初期設定」で行っている起動時初期化イベントを下記のように書き換える。
◾名前
 起動時初期化イベント
◾実行内容
 ◆画面のフェードアウト
 ◆メンバーの入れ替え:プレイヤーを加える
 ◆コモンイベント:初期化
 ◆場所移動:バトルフィールド (8,6)
 ◆画面のフェードイン
  • ゲームを実行し、正常に動くことを確認する。

8.プレイヤーが回転斬りを使えるようにする

回転斬りは、決定キーを一定時間押しっぱなしにしてから離すと、発動するようにします。

  • コモンイベント「剣を振る」の実行内容を以下のように書き換える。(1行目に変数5番「攻撃力」を追加する)
◆変数の操作:#0005 攻撃力 = 1
◆変数の操作:#0002 攻撃X = プレイヤーのマップX
◆変数の操作:#0003 攻撃Y = プレイヤーのマップY
◆条件分岐:プレイヤーが下を向いている
  ◆アニメーションの表示:プレイヤー, 剣↓
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが左を向いている
  ◆アニメーションの表示:プレイヤー, 剣←
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが右を向いている
  ◆アニメーションの表示:プレイヤー, 剣→
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆条件分岐:プレイヤーが上を向いている
  ◆アニメーションの表示:プレイヤー, 剣↑
  ◆変数の操作:#0002 攻撃X -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y -= 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0002 攻撃X += 1
  ◆コモンイベント:対象者取得
  ◆変数の操作:#0003 攻撃Y += 1
  ◆コモンイベント:対象者取得
  ◆
:分岐終了
◆ウェイト:15フレーム
◆スイッチの操作:#0002 剣を振る = OFF
  • 敵キャラをイベントエディタで開き、2ページ目の実行内容を書き換える。
◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度:5
:        :◇プレイヤーの逆を向く
:        :◇一歩前進
:        :◇一歩前進
:        :◇移動速度:3
◆スクリプト:enemyDamage[this.character(0)._eventId - 1] += $gameVariables.value(5);
◆条件分岐:スクリプト:enemyDamage[this.character(0)._eventId - 1] >= 3
  ◆SEの演奏:Explosion1 (90, 100, 0)
  ◆移動ルートの設定:このイベント (ウェイト)
  :        :◇すり抜けON
  :        :◇不透明度:230
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:204
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:179
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:153
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:128
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:102
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:77
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:51
  :        :◇ウェイト:5フレーム
  :        :◇不透明度:26
  :        :◇ウェイト:5フレーム
  ◆イベントの位置設定:このイベント, (0,0)
  ◆セルフスイッチの操作:B = ON
  ◆
:分岐終了
◆セルフスイッチの操作:A = OFF
  • コモンイベント「キー入力受付」を以下のように書き換える。その際、スイッチ4番に「回転斬り」変数6番に「ため量」を新たに作る。
◆条件分岐:ボタン[決定]が押されている
  ◆条件分岐:決定キー押してる時間 = 0
    ◆スイッチの操作:#0002 剣を振る = ON
    ◆
  :分岐終了
  ◆変数の操作:#0006 ため量 += 1
  ◆条件分岐:ため量 = 40
    ◆アニメーションの表示:プレイヤー, ためる
    ◆
  :分岐終了
  ◆変数の操作:#0001 決定キー押してる時間 += 1
  ◆
:それ以外のとき
  ◆条件分岐:決定キー押してる時間 ≥ 1
    ◆条件分岐:ため量 ≥ 40
      ◆スイッチの操作:#0004 回転斬り = ON
      ◆
    :分岐終了
    ◆
  :分岐終了
  ◆変数の操作:#0006 ため量 = 0
  ◆変数の操作:#0001 決定キー押してる時間 = 0
  ◆
:分岐終了
  • コモンイベント「初期化」を以下のように書き換える。
◆スクリプト:enemyDamage = new Array(999);
:     :for(var i = 0; i < 999; i++){
:     : enemyDamage[i] = 0;
:     :}
◆スクリプト:for(var eventID = 1; eventID <= 999; eventID++){
:     : var mapID = this._mapId;
:     : $gameSelfSwitches.setValue([mapID, eventID, "A"], false);
:     : $gameSelfSwitches.setValue([mapID, eventID, "B"], false);
:     :}
◆変数の操作:#0006 ため量 = 0
◆スイッチの操作:#0001 キー入力受付 = ON
◆スイッチの操作:#0003 主人公被ダメージ無敵 = OFF
  • コモンイベント「回転斬り」を作成する。
◾名前
 回転斬り
◾トリガー
 並列処理
◾スイッチ
 0004 回転斬り
◾実行内容
◆スイッチの操作:#0001 キー入力受付 = OFF
◆変数の操作:#0005 攻撃力 = 2
◆変数の操作:#0002 攻撃X = プレイヤーのマップX
◆変数の操作:#0003 攻撃Y = プレイヤーのマップY
◆アニメーションの表示:プレイヤー, 回転斬り
◆変数の操作:#0002 攻撃X -= 1
◆コモンイベント:対象者取得
◆変数の操作:#0003 攻撃Y += 1
◆コモンイベント:対象者取得
◆変数の操作:#0002 攻撃X += 1
◆コモンイベント:対象者取得
◆変数の操作:#0002 攻撃X += 1
◆コモンイベント:対象者取得
◆変数の操作:#0003 攻撃Y -= 1
◆コモンイベント:対象者取得
◆変数の操作:#0003 攻撃Y -= 1
◆コモンイベント:対象者取得
◆変数の操作:#0002 攻撃X -= 1
◆コモンイベント:対象者取得
◆変数の操作:#0002 攻撃X -= 1
◆コモンイベント:対象者取得
◆ウェイト:50フレーム
◆スイッチの操作:#0001 キー入力受付 = ON
◆スイッチの操作:#0004 回転斬り = OFF
  • 敵をイベントエディタで開き、1ページ目の実行内容を以下のように書き換える。こうすることで、ため中に敵からダメージを受けたら、ため量が0になります。
◆条件分岐:決定キー押してる時間 = 1
  ◆イベント処理の中断
  ◆
:分岐終了
◆条件分岐:主人公被ダメージ無敵がON
  ◆イベント処理の中断
  ◆
:分岐終了
◆SEの演奏:Damage1 (90, 100, 0)
◆アニメーションの表示:プレイヤー, ダメージ
◆移動ルートの設定:プレイヤー (飛ばす, ウェイト)
:        :◇180度回転
:        :◇一歩前進
◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
◆変数の操作:#0006 ため量 = 0
◆スイッチの操作:#0003 主人公被ダメージ無敵 = ON
  • これでゲームを実行し、決定キーを長押しすると、回転斬りができるようになります。

9.HPゲージを表示させる

以下のプラグインを使うことで、画面にHPゲージを表示させることができます。