前回の記事では、メモタグを活用して、敵キャラ毎に消滅音を指定するプラグインを作りました。
プラグインの作り方入門その5:敵キャラ毎に消滅音を変更(メモタグ)
目次
今回の目標(スイッチに応じてゲームオーバーの処理を変更)
筆者が初めて作ったプラグインです。
ツクマテでリクエストがあったのを見て「作れそうだな」と思ったので、手を付けたのがきっかけです。
一部のマップでゲームオーバーになっても、流れていたBGMを そのまま流し続けるようにしたい
tm.lucky-duet.com/viewtopic.php?t=8915
第一印象は「一部のマップってマップIDで管理するのめんどくさすぎだろ…」と考え、「指定スイッチがONの時だけ動作が変われば良い」と判断しました。
動作の仕様を決定
指定スイッチがONの時だけ、そのマップで流れているBGMが流れ続けます。
OFFの時は、通常のゲームオーバーのBGMが流れます。
検索するキーワードの選定
これは考えなしに「gameover」で検索しました。
関数を探す
「playGameoverMusic」これでしょ!
プラグインテンプレートに貼り、console.logを入れます。
(() => {
"use strict";
Scene_Gameover.prototype.playGameoverMusic = function () {
AudioManager.stopBgm();
AudioManager.stopBgs();
AudioManager.playMe($dataSystem.gameoverMe);
console.log($dataSystem.gameoverMe);
};
})();
ファイル名を決める
今回は、最終的にプラグインパラメーターで動くようにする予定なので、ファイル名を決めておきます。
(後からでも変えられます)
「SwitchGameoverMusic.js」とします。
マップイベントに
◆ゲームオーバー
を設定し、テストします。
テストプレイを実行し、F8(またはF12)キーを押して、コンソールを表示しておきます。
イベントを実行すると下記のようなログが出ます。
SwitchGameoverMusic.js:8
{name: "Gameover1", pan: 0, pitch: 100, volume: 90}
これは、今回入れた「$dataSystem.gameoverMe」の中身がこのようなデータであることを示しています。
前記事でSEを再生させた時の形式と同じですね。
元のコードを眺めると、BGMなどを止めてから、ゲームオーバーのME(ミュージックエフェクト)を流しているようです。
ここをスイッチで分岐して、動作を分ければ良いでしょう。
条件分岐を追加する
まず、スイッチをどう書くのかを調べます。
「RPGツクールMV スクリプト スイッチ」で検索します。
すると、そのまんまの記事が出てきました。
ツクールMVのスクリプトで条件分岐を行う方法
rpgmaker-script-wiki.xyz/condition_mv.php
サンプルコードを使ってプラグインを書き換えます。
(() => {
"use strict";
Scene_Gameover.prototype.playGameoverMusic = function () {
console.log('$gameSwitches.value(3)');
console.log($gameSwitches.value(3));
if ($gameSwitches.value(3)) {
//何もしない
console.log('何もしない');
} else {
AudioManager.stopBgm();
AudioManager.stopBgs();
AudioManager.playMe($dataSystem.gameoverMe);
console.log($dataSystem.gameoverMe);
}
};
})();
ここはJavaScriptの基本知識が必要になります。
「JavaScript if」で検索すると下記の記事が出てきます。
developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else
MDNはJavaScriptを網羅したリファレンス的存在だと思ってください。
このサイト内でも検索できますが…筆者はあまり上手く検索できたことがありません。
Googleで検索してMDNの記事を探したほうが上手く見つかっている気がします。
if文の情報に戻ります。
リンク先の記事の通り、if(xxx)のxxxの中の条件が満たされた場合、直後の{}内の処理が実行され、満たされなかった場合、else{}内の処理が実行されます。
今回はスイッチがONだとtrueを返すので、このような書き方になります。
つまり、スイッチがONの時はBGM等を止めずに、ゲームオーバーのMEも流さない事になります。
逆に、スイッチがOFFであれば、通常のゲームオーバーの動作をします。
それではスイッチID3をONの時とOFFの時で、コンソールの出力やBGMが変わっているのかテストしましょう。
上手く動作しましたね。
リファクタ(コード改善)と 競合対策(重複コードをフック)
同じ挙動をプラグインに残さないフックと、少しコードを簡易にするリファクタをします。
まず、リファクタをします。
if文の条件について学びます。
developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Expressions_and_Operators#Logical_operators
論理否定 (NOT) (!)
!expr
単一の被演算子を true と見ることができる場合は、false を返します。そうでない場合は true を返します。
今回はこれを利用するとelseが省略できます。
(() => {
"use strict";
Scene_Gameover.prototype.playGameoverMusic = function () {
if (!$gameSwitches.value(3)) {
AudioManager.stopBgm();
AudioManager.stopBgs();
AudioManager.playMe($dataSystem.gameoverMe);
}
};
})();
スイッチがOFFの場合のみ{}の中が実行され、それ以外の時は何もしなくなります。
片方が何も実行しない場合、このようにして順番を入れ替えるとコードが短くまとまります。
次にフックです。
(() => {
"use strict";
const _Scene_Gameover_playGameoverMusic = Scene_Gameover.prototype.playGameoverMusic;
Scene_Gameover.prototype.playGameoverMusic = function () {
if (!$gameSwitches.value(3)) {
_Scene_Gameover_playGameoverMusic.call(this);
}
};
})();
機能としては完成です。
プラグインパラメーターの追加
スイッチIDをプラグインパラメーターで指定できるようにします。
$gameSwitches.value(3); の3だけをパラメーターから変更できれば、これが可能になります。
最初に完成形を出し、処理内容をまとめます。
/*:
* @target MZ MV
* @plugindesc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
*
* @param Game Over Switch Id
* @text 発動スイッチ
* @type switch
* @desc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
* @default 0
*
* @help
* 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
*/
(() => {
"use strict";
const pluginName = 'SwitchGameoverMusic';
const parameters = PluginManager.parameters(pluginName);
const gameOverSwitchId = Number(parameters['Game Over Switch Id']);
const _Scene_Gameover_playGameoverMusic = Scene_Gameover.prototype.playGameoverMusic;
Scene_Gameover.prototype.playGameoverMusic = function () {
if (!$gameSwitches.value(gameOverSwitchId)) {
_Scene_Gameover_playGameoverMusic.call(this);
}
};
})();
プラグインパラメーターの情報
* @param Game Over Switch Id
* @text 発動スイッチ
* @type switch
* @desc 指定スイッチがON時ゲームオーバー時に直前のBGMが続きます。
* @default 0
この部分は
/*:
*/
の間にある必要があります。
ひと塊になっていれば、項目の順番はあまり関係ないようです。
(多分、一番上に@paramがあれば、あとは自由みたいです)
「@param」はパラメーター名です。
同一プラグインの中でユニーク(他と被らない)ものを設定すれば何でも良いですが、現状は半角英数字を使うのが一般になっています。
「@text」はプラグインパラメーターの設定画面での表示テキストです。
省略可能です。
「@type」はこのパラメーター内容を変更する時の挙動を決めます。
今回はスイッチ選択画面を出すために「switch」にしてあります。
省略可能ですが、ないと通常のテキストを入力するフォームになってしまい、スイッチIDを数字で入力することになります。
「@desc」は説明文です。
プラグインパラメーター変更画面を開くと下部に表示されるテキストです。
省略可能です。
「@default」はプラグインを入れた時に、自動的に設定される値です。
省略可能です。
プラグインパラメーターを変数にして取り込む
const pluginName = 'SwitchGameoverMusic';
const parameters = PluginManager.parameters(pluginName);
const gameOverSwitchId = Number(parameters['Game Over Switch Id'] || 0);
この3行でプラグインパラメーターをプラグイン内の変数として取り込んでいます。
これを1行にすると下記のようになります。
(動作確認していませんが、多分…大丈夫)
const gameOverSwitchId = Number(PluginManager.parameters('SwitchGameoverMusic')['Game Over Switch Id'] || 0);
可読性が悪く、プラグインパラメーターが増えてゆくと、とても面倒になりミスが多くなるので、最初のような書き方が一般的になっています。
pluginName はプラグインコマンドにも使う事もできるので、この慣習には従ったほうが良いと思います。
「pluginName」に続いて''で括った文字列がファイル名です。
ここはファイル名を指定する必要があります。
ファイル名を指定する理由を知るには、プラグインパラメーターの設定値がどこに、どのように保存されているのかを知る必要があります。
プロジェクトフォルダ/js/の中に「plugins.js」というファイルがあるので、開いてみましょう。
// Generated by RPG Maker.
// Do not edit this file directly.
var $plugins =
[
{"name":"SwitchGameoverMusic","status":true,"description":"","parameters":{"Game Over Switch Id":"1"}}
];
このようにプラグインファイル名に続いて、保存データが書かれます。
パラメーターの保存インデックスとなる"name":"SwitchGameoverMusic"はファイル名から取得されているので、データを参照の紐付けに統一する必要があります。
これはツクールの仕様ですが、プラグインフォルダ内に同じファイル名は存在できないため、インデックスが重複する事故が防げるというわけです。
プラグインパラメーターで取得したデータをコードに入れる
// if (!$gameSwitches.value(3)) {
if (!$gameSwitches.value(gameOverSwitchId)) {
テストでスイッチIDを3にしていた箇所を、プラグインパラメーターで取得した「gameOverSwitchId」に書き換えてあります。
これで、プラグインパラメーターで指定したスイッチID番号が代入されます。
これには前準備で、パラメーターの文字列を数値に変換しておく必要があります。
その処理が下記です。
const gameOverSwitchId = Number(parameters['Game Over Switch Id'] || 0);
これはパラメーター名「Game Over Switch Id」をNumber()で括ることで数値に変換しています。
その後ろの「 || 0」は、間違って無効なデータが入っていた(何も入っていない)場合、0(デフォルト値)にするという処理です。
「 || 0」は省略できますが、保険に入れておいたほうが良いでしょう。
完成品
色々GitHubをまとめている時に、消しちゃいました(笑)
今回作り直したものを、再掲載しておきます。
fungamemake.com/archives/12432
他のプラグインパラメーター情報
これは奥が深いので、ここでは関連情報だけを書いておきます。
プラグインパラメータのパースの基本形は次の通りです。
const STRING = PARAMS["StringParam"];
const NUMBER = Number.parseFloat(PARAMS["NumberParam"]);
const INTEGER = Number.parseInt(PARAMS["IntegerParam"], 10);
const BOOLEAN = PARAMS["BooleanParam"] === 'true';
- fungamemake.com/archives/9350
- www.5ing-myway.com/rpgmaker-plugin-parameter-type/
- katai5plate.github.io/RPGMV-CoreScript-Reference/jsdoc/MV.PluginSettings.html#parameters
別の記事で、タイプ別の取り込み方の情報を整理します。
次のステップ
プラグインコマンドを作ります。
仕様を把握し、JavaScriptでツクールのゲームデータを引き出したり、配列を操作する初歩に触れます。
プラグインの作り方入門その7:プラグインコマンドの作り方(JavaScriptの配列)
コメントを投稿するにはログインしてください。