RPGツクールMVで、ゼルダの伝説や聖剣伝説風(ファミコン・スーパーファミコン)のシンプルなトップビュー型アクションRPGを作るための方法です。
以下の記事も参考になります。
「コモンイベント」とは、ゲーム中ならいつでも実行できるイベントのこと。コモンイベントは、マップ上、バトル中などを問わずいつでもイベントの実行ができる。
コモンイベントは、『データベースのコモンイベントタブ』で作成できます。
◆画面のフェードアウト ◆メンバーの入れ替え:ハロルドを加える ◆場所移動:マップ (8,6) ◆画面のフェードイン
◆画面のフェードアウト ◆メンバーの入れ替え:ハロルドを加える ◆スイッチの操作:#0001 キー入力受付 = ON ◆場所移動:マップ (8,6) ◆画面のフェードイン
◆条件分岐:ボタン[決定]が押されている ◆条件分岐:決定キー押してる時間 = 0 ◆スイッチの操作:#0002 剣を振る = ON ◆ :分岐終了 ◆変数の操作:#0001 決定キー押してる時間 += 1 ◆ :それ以外のとき ◆変数の操作:#0001 決定キー押してる時間 = 0 ◆ :分岐終了
◆条件分岐:プレイヤーが下を向いている ◆アニメーションの表示:プレイヤー, 剣↓ ◆ :分岐終了 ◆条件分岐:プレイヤーが左を向いている ◆アニメーションの表示:プレイヤー, 剣← ◆ :分岐終了 ◆条件分岐:プレイヤーが右を向いている ◆アニメーションの表示:プレイヤー, 剣→ ◆ :分岐終了 ◆条件分岐:プレイヤーが上を向いている ◆アニメーションの表示:プレイヤー, 剣↑ ◆ :分岐終了 ◆ウェイト:15フレーム ◆スイッチの操作:#0002 剣を振る = OFF
名前:こうもり メモ:[対象者] 画像:正面画像 自律移動 タイプ:ランダム 速度: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]番だよ! ◆ :分岐終了 ◆ :分岐終了
◆指定位置の情報取得:対象者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 画像:なし
◾トリガー イベントから接触 ◾実行内容 ◆条件分岐:決定キー押してる時間 = 1 ◆イベント処理の中断 ◆ :分岐終了 ◆SEの演奏:Damage1 (90, 100, 0) ◆アニメーションの表示:プレイヤー, ダメージ ◆移動ルートの設定:プレイヤー (飛ばす, ウェイト) : :◇180度回転 : :◇一歩前進 ◆HPの増減:パーティ全体, - 50 (戦闘不能を許可)
敵から連続でダメージを受けるのを防ぐため、一度ダメージを受けたら一定時間プレイヤーが無敵になる処理を加える。
◆条件分岐:決定キー押してる時間 = 1 ◆イベント処理の中断 ◆ :分岐終了 ◆条件分岐:主人公被ダメージ無敵がON ◆イベント処理の中断 ◆ :分岐終了 ◆SEの演奏:Damage1 (90, 100, 0) ◆アニメーションの表示:プレイヤー, ダメージ ◆移動ルートの設定:プレイヤー (飛ばす, ウェイト) : :◇180度回転 : :◇一歩前進 ◆HPの増減:パーティ全体, - 50 (戦闘不能を許可) ◆スイッチの操作:#0003 主人公被ダメージ無敵 = ON
◾トリガー 並列処理 ◾スイッチ 0003:主人公被ダメージ無敵 ◾実行内容 ◆ウェイト:30フレーム ◆スイッチの操作:#0003 主人公被ダメージ無敵 = OFF
◾名前 初期化 ◾トリガー なし ◾実行内容 ◆スクリプト: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) ◆画面のフェードイン
回転斬りは、決定キーを一定時間押しっぱなしにしてから離すと、発動するようにします。
◆変数の操作:#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
以下のプラグインを使うことで、画面にHPゲージを表示させることができます。
こんにちは。 こちらの記事と参考リンクを参考にさせて頂いてゲームを作成しているのですが、基本的には上手くいっているのですが一点変な挙動があり、その解決方法がわかりません。 最初の初期設定MAPで主人公の剣を振るエフェクトが一回だけ自動的に出るのですが、これは何故でしょうか? 解決方法があれば教えて頂きたいです。
「主人公の剣を振るエフェクトが出る」ということなので、剣を振るアニメーション表示をしている部分であるコモンイベント「剣を振る」が関係している可能性があります。
このコモンイベントの実行方法は、
なので、何らかの理由でスイッチ2番「剣を振る」がONになっている可能性が考えられます。
スイッチ2番「剣を振る」のスイッチ状態をテストプレイ実行時にリアルタイムトレースしてみてください。
どのタイミングでスイッチ2番がONになっているのかがわかれば、原因が判明すると思います。
デバッグする際は、以下のようなプラグインを使うと効率的にデバッグできます。
イベントの実行順序や実行状況が見えるように確認するには、以下のプラグインも大変便利です。
また、他に考えられることは、コモンイベント「キー入力受付」で、プレイヤーのボタン操作とスイッチ2番の状態を連携させているので、コモンイベント「キー入力受付」の内容に間違いがないか確認してみてください。
アクションRPG制作は大変ですが、ぜひトライしてみてください!