ページ 11

スイッチのオンオフを反転させるプラグインを作りたい。

Posted: 2020年9月21日(月) 20:04
by dokyamu
タイトル通りなのですが、プラグインコマンドを用いて簡単にスイッチのオンオフを反転させるプラグインを作成したいです。

私は全くJavascriptの知識がないため、色々なサイトを調べまわった結果、

コード: 全て選択

function(){
	var parameters = PluginManager.parameters('Switch');
	var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;

	Game_Interpreter.prototype.pluginCommand = function(command, args)
	{
		_Game_Interpreter_pluginCommand.call(this, command, args);

		if(command ==='switch'){
			switch(args[0]){
			case 'switch':
				var switch = Number(args[1]);
				if($gameSwitches.value(switch)){
					$gameSwitches.setValue(switch,false);
				}
				else{
				$gameSwitches.setValue(switch,true);
				}
			}
		}
   	}
このようなプラグインを作成し、プラグインコマンドにて「Switch switch [数字]」と入力することでうまくいくかと思ったのですが、全くうまくいきません。
どなたか、お知恵を貸していただけると幸いです。

Re: スイッチのオンオフを反転させるプラグインを作りたい。

Posted: 2020年9月21日(月) 21:24
by Plasma Dark
とりあえず書いてみようの精神、大変良いと思います。

VisualStudioCode などの、jsを書くために適したエディタを使用することで格段に書きやすくなり、間違いが減りますので、そちらもご検討ください。

プラグインコマンド switch switch [スイッチID] で、指定したIDのスイッチを反転させるプラグインを作りたい、という前提で書きます。
(実はプラグインを書かずとも簡単に実現する方法があるのですが、プラグインを初めて書く練習の題材としては良いと思います)

では、コードの問題を一つずつ見ていきましょう。

1. switch は予約語であり、シンボル名には使用できない

コード中に var switch と書いて、 switch という名前の変数を定義しようとしていますが、 switch というのは JavaScript において if などと同じ予約語であり、変数などの名前には使用できません。
スイッチIDを表す変数ですので、 switchId とか、どうしても switch という語を使いたいのであれば、前後にアンダーバーをつける手法も広く使われているので、どちらかお好きなほうをお選びください。

ちなみに、予約語をシンボルの名前に使おうとすると、VSCodeなどのjsを解析してくれるエディタはちゃんとエラーで教えてくれたりします。

2. 閉じカッコの数が足りない

最初の function(){ に対応する } がありません。

3. グローバルを汚さないために全体を囲むには関数式を

function() { ... } だけでは動きません。下記のようにして、関数式を実行するのが一般的です。

コード: 全て選択

(function() {
 ...
})();
4. 不要なコードを消す

プラグインパラメータの設定は使用されていないようですので、ひとまず消してしまうと良いと思います。

1~4を踏まえて書き直すと以下のようになります。

コード: 全て選択

(function () {
  'use strict';
  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;

  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);

    if (command === 'switch') {
      switch (args[0]) {
        case 'switch':
          var switchId = Number(args[1]);
          if ($gameSwitches.value(switchId)) {
            $gameSwitches.setValue(switchId, false);
          }
          else {
            $gameSwitches.setValue(switchId, true);
          }
      }
    }
  }
})();
とりあえず動かすのであればこんな感じだと思われます。参考までにどうぞ。