ヘルプ希望:MVプラグイン

Aa048
記事: 8
登録日時: 2016年4月09日(土) 11:06

ヘルプ希望:MVプラグイン

投稿記事by Aa048 » 2016年4月09日(土) 11:17

一人で考えるのに、限界を感じてきたので、どなたか教えてください。

弱点属性を突くと、選択したSEを鳴らす簡単なプラグインを作りながら、プラグインの練習をしているのですが、
戦闘テストで何度試してもSEが鳴ってくれません。

参照しているオブジェクトデータから、属性の最大値を算定する
Game_Action.prototype.elementsMaxRateにSEを鳴らすメソッドを追加する、という方式だけでは足りないのか、
メソッドの位置がおかしいのか、そもそも参照するオブジェクトを間違えているのか、
色々考えられるパターンはありますが、もう限界です。

稚拙なプラグインですが、どうか参照して、ご指摘していただけないでしょうか?
添付ファイル
elementSe.js
(1.35 KiB) ダウンロード数: 10 回

アバター
トリアコンタン
記事: 2311
登録日時: 2015年11月10日(火) 21:13
お住まい: きのこ王国
連絡を取る:

Re: ヘルプ希望:MVプラグイン

投稿記事by トリアコンタン » 2016年4月09日(土) 16:26

こんにちは。
最低限、SEが鳴るように修正してみました。
いくつかポイントがありますが、もっとも重要なのが、既存の「Game_Action.prototype.calcElementRate」を再定義して
希望する処理を追加するやり方です。

コード: 全て選択

(function() {
    var parameters = PluginManager.parameters('elementSe');

    var PlaySE = null;
    // パラメータから取得します。
    eval('PlaySE = ' + String(parameters['PlaySe']));
    // 取得できなかった場合、デフォルト値を設定します。
    if (!PlaySE) PlaySE = {name: "Bell3", volume: 90, pitch: 100, pan: 0};

    var _Game_Action_calcElementRate = Game_Action.prototype.calcElementRate;
    Game_Action.prototype.calcElementRate = function(target) {
        // 既存の「calcElementRate」を呼んで結果を「elementRate」に格納します。
        var elementRate = _Game_Action_calcElementRate.apply(this, arguments);
        // 「elementRate」が「1」より大きいと弱点扱いになります。
        if (elementRate > 1) {
            AudioManager.playSe(PlaySE);
        }
        // 呼び出し元に「elementRate」を返します。
        return elementRate;
    };
})();


https://raw.githubusercontent.com/triacontane/RPGMakerMV/master/elementSe.js
プラグイン関連のトラブルが発生した際の切り分けと報告の方法です。
http://qiita.com/triacontane/items/2e227e5b5ce9503a2c30

[Blog] : http://triacontane.blogspot.jp/
[Twitter]: https://twitter.com/triacontane/
[GitHub] : https://github.com/triacontane/
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: ヘルプ希望:MVプラグイン

投稿記事by 名無し蛙 » 2016年4月09日(土) 17:16

お疲れ様です。少し拝見しました。
気に障ったらすみませんが細かいミスや勘違いが多いですね。
とろとろ書いてたら被ってしまったのでミスに対する補足を。

15行目
>var PlaySE = String(parameters['PlaySE'] || {name: "Bell3", volume: 90, pitch: 100, pan: 0});
SEの設定方法がおかしいです。
文字列に変換していますがこの場合はハッシュに変換しなきゃいけません。
書き方は好みによりけりですが今回の引数だとトリアコンタンさんの
eval('PlaySE = ' + String(parameters['PlaySe']));
が一番簡単な変換の仕方ですね。

36-38行目
if (target.elementRate(elementId) > 1.01) {
AudioManager.playSe(elementSe.PlaySE);
};

メソッドから外に出ています。
また、「倍率1.0より上」という条件式なら(target.elementRate(elementId) > 1.00)の方が良いと思います。

※補足の補足
ただ、JavaScriptの計算性能は正確ではなく、誤差が発生し得るので
リスクを考えたら多少余分に見積もった> 1.01の方が適切かもしれませんね。

40行目
})()
必要ないかも知れませんがセミコロンが無いのが気になります。
})();よりも}());の方が推奨されているらしいです。

あと文脈から察するにクリティカルに近い性質だと思うのですが
この位置を弄った場合はミスした時等にもSEが演奏されます。
通常被ダメSEを置換しようと思うとこの頃には結果を保持してる変数がリセットされてしまうので
適度に簡単で鳴らすタイミングが不自然ではないのはこの辺かなぁと思いました。

コード: 全て選択

    var _Game_Action_apply = Game_Action.prototype.apply;
    Game_Action.prototype.apply = function(target) {
        _Game_Action_apply.call(this, target);
        var result = target.result();
        if (result.isHit() && (1.0 < this.calcElementRate(target))) {
            AudioManager.playSe(PlaySE);
        }
    };


プラグインを作る場合はYEP_CoreEngineやトリアコンタンさんが公開している
DevToolsManageというプラグインを導入して常時コンソール画面を表示しておくようにして
きちんと処理が通っているかconsole.log("チェック");等で逐一確認した方が良いですよ。
Aa048
記事: 8
登録日時: 2016年4月09日(土) 11:06

Re: ヘルプ希望:MVプラグイン

投稿記事by Aa048 » 2016年4月09日(土) 18:48

返信を参照させていただきました。

こんな新参に付き合ってくださって、本当にありがとうございます!

>>トリアコンタン様

正直一番の驚きでした。
まさかMVプラグインの大人物が添削してくだるなんて、全く思いもしていませんでしたので、恐悦至極です。
いただいた添削を参照しながら、もう少し頑張ってみます。ありがとうございました!

>>名無し様

厳しいご指摘ありがとうございます。
特に15行目の指摘に関しては目から鱗でした。

細かいミスがバグの温床になるので、早めにご指摘いただいてありがたかったです。
添削、いただかせていただきます。

“MV:質問” へ戻る