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

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

参考リンク

以下の記事も参考になります。

動作デモ

ポイント

コモンイベントとは?

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

手順

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

◆画面のフェードアウト
◆メンバーの入れ替え:ハロルドを加える
◆場所移動:マップ (8,6)
◆画面のフェードイン

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

◆画面のフェードアウト
◆メンバーの入れ替え:ハロルドを加える
◆スイッチの操作:#0001 キー入力受付 = ON
◆場所移動:マップ (8,6)
◆画面のフェードイン
◆条件分岐:ボタン[決定]が押されている
  ◆条件分岐:決定キー押してる時間 = 0
    ◆スイッチの操作:#0002 剣を振る = ON
    ◆
  :分岐終了
  ◆変数の操作:#0001 決定キー押してる時間 += 1
  ◆
:それ以外のとき
  ◆変数の操作:#0001 決定キー押してる時間 = 0
  ◆
:分岐終了
◆条件分岐:プレイヤーが下を向いている
  ◆アニメーションの表示:プレイヤー, 剣↓
  ◆
:分岐終了
◆条件分岐:プレイヤーが左を向いている
  ◆アニメーションの表示:プレイヤー, 剣←
  ◆
:分岐終了
◆条件分岐:プレイヤーが右を向いている
  ◆アニメーションの表示:プレイヤー, 剣→
  ◆
:分岐終了
◆条件分岐:プレイヤーが上を向いている
  ◆アニメーションの表示:プレイヤー, 剣↑
  ◆
:分岐終了
◆ウェイト:15フレーム
◆スイッチの操作:#0002 剣を振る = OFF

3.敵を用意する

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

プライオリティ:通常キャラと同じ
   トリガー:決定ボタン
◆指定位置の情報取得:対象者ID, イベントID, ({攻撃X},{攻撃Y})
◆条件分岐:対象者ID ≠ 0
  ◆文章:なし, ウィンドウ, 下
  :  :\>対象者は\V[4]番だよ!
  ◆
:分岐終了
◆変数の操作:#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
◆指定位置の情報取得:対象者ID, イベントID, ({攻撃X},{攻撃Y})
◆条件分岐:対象者ID ≠ 0
  ◆条件分岐:スクリプト:~$dataMap.events[$gameVariables.value(4)].note.indexOf("[対象者]")
    ◆文章:なし, ウィンドウ, 下
    :  :\>対象者は\V[4]番だよ!
    ◆
  :分岐終了
  ◆
:分岐終了

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);
:     : }
:     :}
出現条件
 セルフスイッチ:A
トリガー:並列処理
プライオリティ:通常キャラと同じ
画像:敵の正面画像を入れる
オプション
  歩行アニメ:チェックを入れる
 足踏みアニメ:チェックを入れる
実行内容:

◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度:5
:        :◇プレイヤーの逆を向く
:        :◇一歩前進
:        :◇一歩前進
:        :◇移動速度:3
◆セルフスイッチの操作:A = OFF
◆画面のフェードアウト
◆メンバーの入れ替え:プレイヤーを加える
◆スクリプト:enemyDamage = new Array(999);
:     :for(var i = 0; i < 999; i++){
:     : enemyDamage[i] = 0;
:     :}
◆スイッチの操作:#0001 キー入力受付 = ON
◆場所移動:バトルフィールド (8,6)
◆画面のフェードイン
◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度: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
出現条件
 セルフスイッチ:B
画像:なし

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

◾トリガー
イベントから接触

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

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

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

◆条件分岐:決定キー押してる時間 = 1
  ◆イベント処理の中断
  ◆
:分岐終了
◆条件分岐:主人公被ダメージ無敵がON
  ◆イベント処理の中断
  ◆
:分岐終了
◆SEの演奏:Damage1 (90, 100, 0)
◆アニメーションの表示:プレイヤー, ダメージ
◆移動ルートの設定:プレイヤー (飛ばす, ウェイト)
:        :◇180度回転
:        :◇一歩前進
◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
◆スイッチの操作:#0003 主人公被ダメージ無敵 = ON
◾トリガー
並列処理
◾スイッチ
0003:主人公被ダメージ無敵
◾実行内容
◆ウェイト:30フレーム
◆スイッチの操作:#0003 主人公被ダメージ無敵 = OFF

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.プレイヤーが回転斬りを使えるようにする

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

◆変数の操作:#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
◆アニメーションの表示:このイベント, ダメージ
◆移動ルートの設定:このイベント (飛ばす, ウェイト)
:        :◇移動速度: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
◆条件分岐:ボタン[決定]が押されている
  ◆条件分岐:決定キー押してる時間 = 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
  ◆イベント処理の中断
  ◆
:分岐終了
◆条件分岐:主人公被ダメージ無敵がON
  ◆イベント処理の中断
  ◆
:分岐終了
◆SEの演奏:Damage1 (90, 100, 0)
◆アニメーションの表示:プレイヤー, ダメージ
◆移動ルートの設定:プレイヤー (飛ばす, ウェイト)
:        :◇180度回転
:        :◇一歩前進
◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
◆変数の操作:#0006 ため量 = 0
◆スイッチの操作:#0003 主人公被ダメージ無敵 = ON

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

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

頂いた質問についての解答

剣を振るアニメーションについて

こんにちは。
こちらの記事と参考リンクを参考にさせて頂いてゲームを作成しているのですが、基本的には上手くいっているのですが一点変な挙動があり、その解決方法がわかりません。
最初の初期設定MAPで主人公の剣を振るエフェクトが一回だけ自動的に出るのですが、これは何故でしょうか?
解決方法があれば教えて頂きたいです。

「主人公の剣を振るエフェクトが出る」ということなので、剣を振るアニメーション表示をしている部分であるコモンイベント「剣を振る」が関係している可能性があります。
このコモンイベントの実行方法は、

なので、何らかの理由でスイッチ2番「剣を振る」がONになっている可能性が考えられます。

スイッチ2番「剣を振る」のスイッチ状態をテストプレイ実行時にリアルタイムトレースしてみてください。
どのタイミングでスイッチ2番がONになっているのかがわかれば、原因が判明すると思います。

デバッグする際は、以下のようなプラグインを使うと効率的にデバッグできます。

イベントの実行順序や実行状況が見えるように確認するには、以下のプラグインも大変便利です。

また、他に考えられることは、コモンイベント「キー入力受付」で、プレイヤーのボタン操作とスイッチ2番の状態を連携させているので、コモンイベント「キー入力受付」の内容に間違いがないか確認してみてください。

アクションRPG制作は大変ですが、ぜひトライしてみてください!