【解決】プラグインコマンドから取得するJSON(?)を配列に変換する方法

munokura

ユーザー
先日、質問したCommonPopupCoreをMZ用に移植を進めています。

とりあえず動作するところまでこぎ着けたのですが、Coreの名前通り付属のプラグインがあるというのもあり、できるだけ変更しないことを1つの方針として改変しました。

その中でMZでのプラグインコマンドで取得される値を、元のプラグインが要望している値に変換する処理を入れたのですが、「もぅどうにでもなーれ」(通称ゴリラ実装?)というコードで実現しています。

クソコードなのを自覚しているので、これをマシにする書き方をご指導ください。
根本から見直すべきプラグインの可能性は感じていますが、今回はコードの改善方法を求めているということで、お願いいたします。

JavaScript:
    PluginManager.registerCommand(pluginName, "CommonPopupAdd", function (args) {
        var argParam = new Array(
            'add',
            'text:' + String(args.text),
            'eventId:' + String(args.eventId),
            'count:' + String(args.count),
            'delay:' + String(args.delay),
            'moveX:' + String(args.moveX),
            'moveY:' + String(args.moveY),
            'sx:' + String(args.sx),
            'sy:' + String(args.sy),
            'pattern:' + String(args.pattern),
            // 'back:' + String(args.back),
            'bx:' + String(args.bx),
            'by:' + String(args.by),
            'extend:' + String(args.extend),
            'fixed:' + String(args.fixed),
            'anchorX:' + String(args.anchorX),
            'anchorY:' + String(args.anchorY),
            'slideCount:' + String(args.slideCount)
        );
        var eventId = 0;
        for (var i = 0; i < argParam.length; i++) {
            if (argParam[i].match(/^eventId:(.+)/g)) {
                eventId = Number(RegExp.$1);
                break;
            }
        }
        var character = this.character(eventId);
        var arg = CommonPopupManager.setPopup(argParam, character);
        // if (arg.back > 0 || typeof arg.back === 'string') {
        //     CommonPopupManager.bltCheck(CommonPopupManager.makeBitmap(arg));
        //     CommonPopupManager._readyPopup.push(arg);
        // } else {
        CommonPopupManager._tempCommonSprites.setNullPos(arg);
        // }
    });
 

まっつUP

ユーザー
munokura様

よく分からなかったですがこのプラグインコマンドの部分は
多分これで良いと思います。
備考:PluginCommonBase.jsの機能を使っていないためargs.eventIdは数値化の必要あり
JavaScript:
PluginManager.registerCommand(pluginName, "CommonPopupAdd", function (args) {
    const copyarg = Object.keys(args).map(el => el + ":" + args[el]);
    copyarg.unshift("add");
    const posobj = CommonPopupManager.setPopup(copyarg, this.character(Number(args.eventId)));
    CommonPopupManager._tempCommonSprites.setNullPos(posobj);
});
 
最後に編集:

munokura

ユーザー
明確な書き方でなく申し訳ございません。

MZのプラグインコマンドで受け取る
コード:
{text: "テスト", eventId: "-1", count: "600", delay: "0", moveX: "0", …}
という形を

コード:
["add", "text:テスト", "eventId:-1", "count:600", "delay:0", "moveX:0", "moveY:-48", "sx:0", "sy:0", "pattern:0", "bx:0", "by:0", "extend:", "fixed:true", "anchorX:0.5", "anchorY:0.5", "slideCount:"]

という形に変換する方法を望んでいました。

ご指導いただいたとおり、

コード:
        var argParam = new Array(
            'add',
            'text:' + String(args.text),
            'eventId:' + String(args.eventId),
            'count:' + String(args.count),
            'delay:' + String(args.delay),
            'moveX:' + String(args.moveX),
            'moveY:' + String(args.moveY),
            'sx:' + String(args.sx),
            'sy:' + String(args.sy),
            'pattern:' + String(args.pattern),
            'bx:' + String(args.bx),
            'by:' + String(args.by),
            'extend:' + String(args.extend),
            'fixed:' + String(args.fixed),
            'anchorX:' + String(args.anchorX),
            'anchorY:' + String(args.anchorY),
            'slideCount:' + String(args.slideCount)
        );

コード:
        var argParam = Object.keys(args).map(el => el + ":" + args[el]);
        argParam.unshift("add");
と書き換えることで、望み通りの結果を得ることが出来ました。

これから、処理方法の詳細を調べて学習することにいたします。

ご指導いただき、ありがとうございました。
 

DarkPlasma

ユーザー
細かい話ですが、 Object.entries や テンプレートリテラル を用いたほうが可読性の面で良い気がします。

JavaScript:
var argParam = Object.entries(args).map(([key, value]) => `${key}:${value}`);
argParam.unshift("add");
 
トップ