ページ 11

【解決済み】HzTimingBarのヒットエリアで変数を参照させたい

Posted: 2023年8月23日(水) 19:06
by ナナカマド
お世話になっております。
タイミングバーイベントを実行させるHzTimingBarを使用させていただいております。
実行の際にプラグインコマンドでそれぞれのエリアを設定するのですが、そのエリアにランダム性を持たせたいと考え変数を参照させる方法があればお教えいただきたいです。

現状は数値を微変させた複数のイベントを設定し、条件分岐により疑似的なランダム性を表現していますが
こだわりだすと分岐が数百を超え設定・管理方法としてはあまりスマートでは無いと感じております。
数値に変数を使えるようになれば解決するのではと考えた次第です。

本件に関してまして解決方法や別途の案などがございましたらお知恵をお貸しいただけますと幸いです。

Re: HzTimingBarのヒットエリアで変数を参照させたい

Posted: 2023年8月23日(水) 23:53
by ecf5DTTzl6h6lJj02
こんばんは。
ナナカマド さんが書きました:お世話になっております。
タイミングバーイベントを実行させるHzTimingBarを使用させていただいております。
実行の際にプラグインコマンドでそれぞれのエリアを設定するのですが、そのエリアにランダム性を持たせたいと考え変数を参照させる方法があればお教えいただきたいです。

現状は数値を微変させた複数のイベントを設定し、条件分岐により疑似的なランダム性を表現していますが
こだわりだすと分岐が数百を超え設定・管理方法としてはあまりスマートでは無いと感じております。
数値に変数を使えるようになれば解決するのではと考えた次第です。

本件に関してまして解決方法や別途の案などがございましたらお知恵をお貸しいただけますと幸いです。
今回のプラグインに関してはMITライセンスなので問題ありませんが、
利用規約だったり、権利関係だったりがあるので、プラグインファイルを添付する際は、十二分にお気を付けください。
ダウンロードできるサイトへのリンクを記載するようにするほうが無難です。
(アドレスを書いた部分を範囲選択し、上にある URL のボタンを押すとリンクに変わります)

Hz Timing Bar(HzTimingBar.js) (ツクプラの紹介記事に飛びます)
https://plugin.fungamemake.com/archives/13320

で、本題に関してですが、
HzTimingBar.js を JavaScript を編集できるソフト (お勧めは VisualStudioCode)で開き、
以下の編集を行ってください。
(編集の前に必ずファイルのバックアップを取っておいてください)
  1. 76 行目あたり の
    var missSe = parameters['miss SE'];
    となっている次の行に、以下のスクリプトを挿入してください。

    コード: 全て選択

    
        // \V[n] を 変数ID n の値に置き換える関数
        var convertVariableNumber = function(text) {
            text = text.replace(/\\/g, '\x1b');
            text = text.replace(/\x1b\x1b/g, '\\');
            while (text.match(/\x1bV\[(\d+)\]/i)) {
                text = text.replace(/\x1bV\[(\d+)\]/gi, function() {
                    return $gameVariables.value(parseInt(arguments[1]));
                }.bind(this));
            }
            return text;
        };
    
    
  2. 89行目あたりから始まる、プラグインコマンドに関するメソッド部分を以下に変更してください。

    コード: 全て選択

        var _Game_Interpreter_pluginCommand =
            Game_Interpreter.prototype.pluginCommand;
        Game_Interpreter.prototype.pluginCommand = function (command, args) {
            _Game_Interpreter_pluginCommand.call(this, command, args);
            // スクリプトコマンド「HZCOMMAND」
            if (command.toUpperCase() === 'HZTIMINGBAR') {
                this.setWaitMode("hzTimingBar");
                var varNo = Number(args[0]);
                if (varNo <= 0) {
                    console.error(`結果を代入する変数IDが正しく入力されていません。\n\t入力された値: ${varNo}\n結果を代入する変数として 変数ID 0001 を設定します。`);
                    varNo = 1;
                }
                var hitAreaParm = String(args[1]);
                var criticalAreaParm = String(args[2]);
                var requiredAreaParm = String(args[3]);
                var x = args[4] != null ? Number(args[4]) : SceneManager._screenWidth / 2;
                var y = args[5] != null ? Number(args[5]) : SceneManager._screenHeight / 2;
                var hitArea = hitAreaParm.split("-").map(function (elm) {
                    elm = convertVariableNumber(elm);
                    if (isNaN(elm)) {
                        console.error(`ヒット範囲の値を正しく変換できませんでした。\n\t変換結果: ${elm}\n0 として扱います。`);
                        elm = 0;
                    }
                    return Number(elm);
                });
                var criticalArea = [];
                if (criticalAreaParm !== 'undefined') {
                    criticalArea = criticalAreaParm.split("-").map(function (elm) {
                        elm = convertVariableNumber(elm);
                        if (isNaN(elm)) {
                            console.error(`クリティカル範囲の値を正しく変換できませんでした。\n\t変換結果: ${elm}\n0 として扱います。`);
                            elm = 0
                        }
                        return Number(elm);
                    });
                }
                var requiredAreas = [];
                if (requiredAreaParm !== 'undefined') {
                    requiredAreas = requiredAreaParm.substring(1, requiredAreaParm.length - 1).split(",").map(function (requiredArea) {
                        return requiredArea.split("-").map(function (elm) {
                            elm = convertVariableNumber(elm);
                            if (!isNaN(elm)) {
                                console.error(`必須範囲の値を正しく変換できませんでした。\n\t変換結果: ${elm}\n0 として扱います。`);
                                elm = 0;
                            }
                            return Number(elm);
                        });
                    });
                };
    
                if ($gameTemp.isPlaytest()) {
                    console.log(hitArea, criticalArea, requiredAreas);
                }
    
                this._timingBar = new HzTimingBar(x, y, hitArea, criticalArea, requiredAreas, varNo);
            }
        };
    
  3. 185 行目あたりから始まっている HzTimingBar,prototype.initialize メソッド の
    最初の2行を 以下に変更してください。

    コード: 全て選択

        HzTimingBar.prototype.initialize = function (x, y, hitArea, criticalArea, requiredAreas, varNo) {
            this._varNo = varNo;
    
これで、範囲の指定に、\V[n] を使用できるようになると思います。
範囲(ヒット範囲、クリティカル範囲、必須範囲)の指定にのみ使えます。
結果を保存する変数IDの指定や、 表示位置の指定には使えません。

以上、ご確認ください。

Re: HzTimingBarのヒットエリアで変数を参照させたい

Posted: 2023年8月24日(木) 01:20
by ナナカマド
頂いたスクリプトの情報を挿入することで求めていた動きが可能となりました。
この度は早々のご対応ありがとうございました。

またプラグイン添付に関するご忠告ありがとうございます。
以後気を付けます。
本トピックにて添付していたファイルは削除いたします。