(解決)$gameVariables.setValue(a,b)の短縮

hadhad
記事: 20
登録日時: 2016年6月09日(木) 15:55

(解決)$gameVariables.setValue(a,b)の短縮

投稿記事by hadhad » 2016年10月19日(水) 22:59

お世話になっております。

イベントエディタのスクリプトから変数の操作を行う際に「$gameVariables.setValue(a,b)」を使用するのですが、
文字数が長く見栄えが悪いので「sVal(a,b)」といった具合に、文字数が短く機能が同じ関数を作りたいと思っています。

また、「$gameMessage.add(a);if(b)$gameMessage.setFaceImage(b, 0);」といったスクリプトの組み合わせを、
纏めて「Mes(a,b)」といった文字数が短い1つの関数にしたいと思っています。

こういった場合、どのようにプラグインを書けばいいのでしょうか?
最後に編集したユーザー hadhad on 2016年10月20日(木) 19:31 [ 編集 2 回目 ]

名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: $gameVariables.setValue(a,b)の短縮

投稿記事by 名無し蛙 » 2016年10月20日(木) 00:09

どうもお疲れ様です。

そこまで分かるのならあとはGame_Interpreterに増設するだけ、なんですが
どうせならプラグインコマンド化する事をオススメします。
イベントコマンド>スクリプトは柔軟に対応出来る反面、重い処理なので頻繁に使うものではないです。
プラグインコマンド化して呼び出した方がいくらか負荷を軽減出来ます。

コード: 全て選択

(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);
        switch(command) {
            case 'sVal':
                var a = Number(args[0]);
                var b = Number(args[1]);
                $gameVariables.setValue(a, b);
                break;
            case 'Mes':
                var a = String(args[0]);
                var b = args[1] ? String(args[1]) : null;
                $gameMessage.add(a);
                if (b) $gameMessage.setFaceImage(b, 0);
                break;
        }
    };
}());


一応これでイベントコマンド>プラグインコマンドの方で
Mes HelloWorld
等と書けば動くと思います。()や,は不要で区切りは半角スペースです。
hadhad
記事: 20
登録日時: 2016年6月09日(木) 15:55

Re: $gameVariables.setValue(a,b)の短縮

投稿記事by hadhad » 2016年10月20日(木) 13:08

早速のご回答ありがとうございます。

その方法は知っていたのですが、プラグインコマンドの場合は「値を返す」という事をする場合が面倒ですので、
あえてスクリプトで使う関数を追加したいと思っていました。

例えば、「console.log(sVal(a,b));」とした時に、コンソールに変更前と変更後の値の違いを文字列で出力されたり、
「console.log(Mes(a,b));」とした時に、コンソールに文字数を数えて返すなどと言った処理を加えたいのです。

また、試験的な処理を書く際にスクリプト機能を多用するため、
◆プラグインコマンド: Mes a b c(文字数を代入する変数ID)
◆スクリプト: var c = ???; console.log($gameVariables.value(c));
のみたいにするよりも
◆スクリプト: console.log(Mes(a,b));
と書いてしまいたいのです。
かといってpluginCommand関数を使うのも何か違いますし。

こういった事例でも、プラグインコマンドで「短く単純に」解消する方法があるのでしょうか?

また、この処理は重い軽いといった比較は、どのようにすればできるのか教えて頂けますでしょうか。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: $gameVariables.setValue(a,b)の短縮(と、返り値)

投稿記事by 名無し蛙 » 2016年10月20日(木) 17:55

>その方法は知っていたのですが、プラグインコマンドの場合は「値を返す」という事をする場合が面倒ですので、
>あえてスクリプトで使う関数を追加したいと思っていました。
確かにイベントコマンド>スクリプト内で使う事が前提ならばプラグインコマンド化は迂遠ですね。
スクリプトコマンドを増設する場合も基本的にGame_Interpreter.prototypeに増設します。

コード: 全て選択

(function() {
    'use strict'
   
    Game_Interpreter.prototype.sVal = function(a, b) {
        $gameVariables.setValue(a, b);
        return $gameVariables.value(a);
    };
}());

注意点としてはjavascriptの仕様上thisの省略は出来ません。呼び出す場合はthis.sVal(a, b)です。
RGSSならthis(self)の省略が出来たんですけどね。
難しい事でもないので今後のスキルアップの為にも
Mes(this.Mes)の方は上の書式に則ってご自分で実装してみてください。

>また、この処理は重い軽いといった比較は、どのようにすればできるのか教えて頂けますでしょうか。
自分の場合は簡単なベンチマークで判断しています。
javascriptは以下のコマンドで2点間の処理時間を計測する事が出来ます。

コード: 全て選択

console.time('任意の文字列'); // 計測開始
console.timeEnd('任意の文字列'); // 計測終了、及び表示

これを応用して
こちらでテストプレイすると大体20倍前後、差が出るのでイベントコマンド>スクリプトは鈍重だと判断しました。
見ての通りカウントアップの書き方を変えてるだけです。
勿論、実行環境によって差異は出ると思うので一概には言えませんが。
添付ファイル
ss3.png
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: $gameVariables.setValue(a,b)の短縮(と、返り値)

投稿記事by 奏ねこま » 2016年10月20日(木) 19:26

どうしても「this.sVal(a, b)」という書き方をしたくない(thisを付けたくない)なら、

コード: 全て選択

(function () {
    'use strict';

    function sVal(a, b) {
        $gameVariables.setValue(a, b);
        return $gameVariables.value(a);
    }
   
    Game_Interpreter.prototype.command355 = function() {
        var script = this.currentCommand().parameters[0] + '\n';
        while (this.nextEventCode() === 655) {
            this._index++;
            script += this.currentCommand().parameters[0] + '\n';
        }
        eval(script);
        return true;
    };
}());

こんな感じでcommand355関数をまるごとプラグインに取り込めば、できないことはないですね。
hadhad
記事: 20
登録日時: 2016年6月09日(木) 15:55

Re: $gameVariables.setValue(a,b)の短縮(と、返り値)

投稿記事by hadhad » 2016年10月20日(木) 19:31

・名無し蛙 さん

詳細な解説とともにありがとうございます。

>スクリプトコマンドを増設する場合も基本的にGame_Interpreter.prototypeに増設します。
>注意点としてはjavascriptの仕様上thisの省略は出来ません。呼び出す場合はthis.sVal(a, b)です。
「Game_Interpreterに増設するだけ」の意味が良く分からなかったのですが、そういう事だったのですね。

>javascriptは以下のコマンドで2点間の処理時間を計測する事が出来ます。
確かに、スクリプトよりもプラグインコマンドのほうが早いですね。
教えて頂いた通り測ってみたら以下の通りでした。
スクリプト : this.sVal(a,b) → 1.050ms
プラグインコマンド : sVal a b → 0.523ms

デバッグの時だけスクリプトの方を用い、実装する時のみプラグインコマンドを使うようにしようと思います。


・奏ねこま(@こま) さん

こんなやり方もあるんですね。
速度は1.305msととても遅いですが、
書き易さで考えたらこちらの方がよさそうです。


どうもありがとうございました。

“MV:質問” へ戻る