【解決済み】プラグインのウエイトについて

アバター
ザコバダンキチ
記事: 3
登録日時: 2016年6月21日(火) 19:49
連絡を取る:

【解決済み】プラグインのウエイトについて

投稿記事by ザコバダンキチ » 2023年5月23日(火) 20:51

はじめまして。ザコバダンキチと申します。

現在、RPGツクールMZにてプラグインを作っているのですが、どうしてもエラーが出てしまいます。

プラグイン上でウエイトを置きたいので、this.wait(n);と記述するのですが、何度やってもエラーです。

スクリプト上では動くので、記述間違いでは無いと思います。

もし分かる方がいらっしゃるのであれば、アドバイスをいただけたら幸いです。

どうかよろしくお願いいたします。
添付ファイル
2023-05-23.png
最後に編集したユーザー ザコバダンキチ on 2023年5月24日(水) 20:52 [ 編集 1 回目 ]

アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: プラグインのウエイトについて

投稿記事by Plasma Dark » 2023年5月23日(火) 22:15

作成されているプラグインのコードを見ないと何とも言えませんが、そのコード実行中において、thisとは何かを意識されると良いかと思います。

イベントコマンドのスクリプトは実行中の Game_Interpreter のインスタンスをthisとしており、Game_Interpreterクラスにはwaitメソッドが定義されているので、正常に動作します。
アバター
ザコバダンキチ
記事: 3
登録日時: 2016年6月21日(火) 19:49
連絡を取る:

Re: プラグインのウエイトについて

投稿記事by ザコバダンキチ » 2023年5月24日(水) 12:27

ご返信ありがとうございます。

コードはこちらとなります。

コード: 全て選択

function damageText(){

    'use strict';

    //BP攻撃力代入
    let str = $gameVariables.value(11);
           
    //乱数代入

    if (str > 0){
        let random = Math.floor( Math.random() * $gameVariables.value(12));
        str += random
       
        //命中判定

        let hit = Math.floor( Math.random() * 101);
        console.log(hit);
        if( $gameVariables.value(14) >= hit){
            console.log('hit!')

            //ダメージ数式代入

            $gameVariables.setValue(15,str);
            str = str.toString();
            let str1 = str.substring(str.length -1,str.length -0);
            let str10 = str.substring(str.length -2,str.length -1);
            let str100 = str.substring(str.length -3,str.length -2);
            //alert(str100 + str10 + str1);
 
            //画像代入
 
            $gameScreen.showPicture(10,`${str100}`,0,200,220,100,100,255,0);
            $gameScreen.showPicture(11,`${str10}`,0,223,220,100,100,255,0);
            $gameScreen.showPicture(12,`${str1}`,0,246,220,100,100,255,0);

            //ダメージスクロール

            $gameScreen.movePicture(10,0,200,190,100,100,255,0,30);
            $gameScreen.movePicture(11,0,223,190,100,100,255,0,30);
            $gameScreen.movePicture(12,0,246,190,100,100,255,0,30);
 
            //ウエイト
            this.wait(60);
           
            //削除

            //$gameScreen.erasePicture(10);
            //$gameScreen.erasePicture(11);
            //$gameScreen.erasePicture(12);

            //終了

        }   else{
            console.log('MISS')

            //画像代入
            $gameScreen.showPicture(12,'miss',0,246,220,100,100,255,0);

            //ダメージスクロール



        }
    } else {

        //画像代入
 
        $gameScreen.showPicture(12,'0',0,246,220,100,100,255,0);

        //ダメージスクロール

    }
   


}


まだまだ作りかけなのですが…。
thisとは何かと聞かれたらお恥ずかしながらまだ完全に理解できておりません。
今回が初プラグインなもので…。

Game_Interpreterが正常に動いていないということでしょうか?
アバター
Plasma Dark
記事: 669
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: プラグインのウエイトについて

投稿記事by Plasma Dark » 2023年5月24日(水) 14:04

どこから説明したものか迷いますが、ひとまずthisに関して

this - JavaScript | MDN
https://developer.mozilla.org/ja/docs/W ... ators/this

strict モードでは、実行コンテキストに入るときに this 値が設定されていないと、以下の例のように undefined のままになります。


とあるように、ご提示頂いたプラグインで使われている this は(呼び元から束縛されていない限り) undefined です。


そして、このケースではdamageText関数実行時のthisをGame_Interpreterインスタンスに束縛したり、damageText関数をGame_Interpreterクラスのメソッドとして定義したりしてwaitメソッドをとりあえず呼び出せるようにしたところで、意図通りのウェイトは実現できなさそうです。

ツクールで実装されているウェイトは、イベントコマンド同士の間に挟むウェイトであって、1コマンド内でウェイトをはさみながら複数の処理を逐次実行するような挙動を実現するには、かなり複雑なコードを書く必要があります。
参考: viewtopic.php?f=23&t=13259&p=48879#p48879
(MVの記事ですが、MZでもGame_Interpreterクラスの大まかな設計は変わっていません)

初めてプラグインを書かれるということなので、もう少し処理を小さく分けて実現されることを推奨したいですね。
例えば、ダメージ計算を行ってその結果を指定した変数に代入するだけのプラグインコマンドとか。

引数のない damageText 関数を作られているということと、処理に書かれた内容から推測するに、以下の流れをイベントから呼び出したいのだと思いますが、間違いないでしょうか。
- ダメージ計算や命中判定を行う
- 結果に応じて画像でダメージやMISS表示をする
- しばらく待って画像を非表示にする

全てひとまとめにするとコードが複雑になるので、それぞれを別々のプラグインコマンドにして、それを呼び出す形にしてみてはいかがでしょう。
例えば、こんなふうに

コード: 全て選択

/*
 * @target MZ
 * @command calcDamageAndHit
 * @text ダメージ計算・命中判定
 */
(() => {
  'use strict';
  const IS_HIT_SWITCH = 1; // 命中判定スイッチ
  const ATK_VARIABLE = 11; // 攻撃力変数
  const VARIANCE_VARIABLE = 12; // ダメージ分散変数
  const HIT_RATE_VARIABLE = 14; // 命中率変数
  const DAMAGE_VARIABLE = 15; // ダメージ変数
  PluginManager.registerCommand('プラグイン名', 'calcDamageAndHit', function (args) {
    const isHit = $gameVariables.value(HIT_RATE_VARIABLE) >= Math.floor( Math.random() * 100);
    $gameSwitches.setValue(IS_HIT_SWITCH, isHit);
    const damage = $gameVariables.value(ATK_VARIABLE)
      + Math.floor( Math.random() * $gameVariables.value(VARIANCE_VARIABLE));
    $gameVariables.setValue(DAMAGE_VARIABLE, damage);
  });

  // 以下、同じようにして画像表示や画像非表示のプラグインコマンドを書く
})();


プラグインコマンドの作り方については、下記記事でも解説しています。
https://ci-en.net/creator/15997/article/768402
アバター
ザコバダンキチ
記事: 3
登録日時: 2016年6月21日(火) 19:49
連絡を取る:

Re: プラグインのウエイトについて

投稿記事by ザコバダンキチ » 2023年5月24日(水) 20:50

ご返信ありがとうございます。

this.wait(n);についてはご提示いただいたURLでわかりました。

プラグインでウエイトを行うのは難しいですね…。
うまくコモンイベントと組み合わせながら使いたいと思います。

それと、プラグインですが
- ダメージ計算や命中判定を行う
- 結果に応じて画像でダメージやMISS表示をする
- しばらく待って画像を非表示にする
で、問題ありません。

わざわざ短縮していただいてありがとうございます。
今後のプラグイン作成の参考にさせていただきたいと思います。

ご多忙の中、ご教示いただき、誠にありがとうございます。
これからも質問するかと思いますので、その時はよろしくお願いいたします。

“MZ:質問” へ戻る