【解決済み】スクリプトからピクチャの表示を実行した際の描画処理について

アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

【解決済み】スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by ドラムカン » 2022年5月21日(土) 12:32

いつもお世話になっております。

以下、独自のプラグイン(関数)を作成しており、
引数に画像の名前('F'+何らかの一文字)を指定すると、それぞれ別のピクチャ番号で別の座標に描画されるようになっております。

コード: 全て選択

function Original_picture(str){

  //引数文字列を一文字ずつ切り出して画像名配列とする
  let arrStr = str.split('');
 
  //y座標の定数宣言
  const ys = 450;

  //画像名配列とピクチャ番号と描画位置を紐づけるためオブジェクトリテラル化
  var fruits = {
      0 : { "str" : arrStr[0], "index":1 , "x":310 , "y":ys },
      1 : { "str" : arrStr[1], "index":2 , "x":358 , "y":ys },
      2 : { "str" : arrStr[2], "index":3 , "x":382 , "y":ys },
      3 : { "str" : arrStr[3], "index":4 , "x":406 , "y":ys }
  };

  //オブジェクト項目分ループ
  for (key in fruits) {
      //ピクチャの描画
      $gameScreen.showPicture(fruits [key].index,"F"+fruits [key].str,0,fruits [key].x,fruits [key].y,100,100,255,0);
  }
 
}


あとはイベントスクリプトで
Original_picture('ABCD');
と入れて実行すれば、
FA.png、FB.png・・・
という風に描画されます。

これはこれでできているのですが、
問題は、AとBの描画の間にウエイトを設けられないということです。

どうも、イベントスクリプトがすべて終わるまで、ピクチャは描画されないらしく
どうウエイトを挟んでも、ABCDがいっぺんに表示されてしまいます。

そのため、

コード: 全て選択

イベントスクリプト:Original_picture('A');
         :ウエイト処理
イベントスクリプト:Original_picture('B');
         :ウエイト処理
イベントスクリプト:Original_picture('C');
         :ウエイト処理
イベントスクリプト:Original_picture('D');
         :ウエイト処理

という具合にしなければならず、何のために関数化したのか分からなくなりました。
しかも上記のやり方だと、当然オブジェクトリテラルも意味をなさなくなり、
同じピクチャ番号に上書き描画されるため、イベントコマンドのピクチャ表示を利用した方が良いということになります。

$gameScreen.showPicture()の後に、ウエイトを挟んで一つずつ描画させるのは
やはり不可能なのでしょうか?
refreshを挟んでも駄目だったので、ピクチャはそういう仕様なのでしょうか?

何卒、ご教示いただけますと幸いです。
よろしくお願い申し上げます。
最後に編集したユーザー ドラムカン on 2022年5月21日(土) 22:43 [ 編集 1 回目 ]

アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by WTR » 2022年5月21日(土) 16:20

ピクチャの仕様というわけではなく
イベントコマンド・ウェイトの仕様という感じでしょうか。

ウェイトはイベントコマンドとイベントコマンドの間でしかかかりません。
『スクリプト』というイベントコマンドは複数行で記述しても結局1つのイベントコマンドなので
途中ではどうしようもありません。

提案としては微妙かもしれませんが
Original_picture を何度も実行していいのであれば描画タイミングをずらすことはできます。
条件が合致したときだけ描画されるような関数にしておいて、並列処理でぐるぐる回しっぱなしにするみたいな。

例えば

コード: 全て選択

function Original_picture(str){
  // 変数1 をフレームカウンタとする。80を超えていたら何もしない
  if ($gameVariables.value(1) >= 80) return;
  $gameVariables.setValue(1, $gameVariables.value(1) + 1);

  //引数文字列を一文字ずつ切り出して画像名配列とする
  let arrStr = str.split('');
 
  //y座標の定数宣言
  const ys = 450;

  //画像名配列とピクチャ番号と描画位置を紐づけるためオブジェクトリテラル化
  var fruits = {
      0 : { "str" : arrStr[0], "index":1 , "x":310 , "y":ys },
      1 : { "str" : arrStr[1], "index":2 , "x":358 , "y":ys },
      2 : { "str" : arrStr[2], "index":3 , "x":382 , "y":ys },
      3 : { "str" : arrStr[3], "index":4 , "x":406 , "y":ys }
  };

  //オブジェクト項目分ループ
  for (key in fruits) {
      //ピクチャの描画
      if ($gameVariables.value(1) === fruits[key].index * 20) {
         $gameScreen.showPicture(fruits [key].index,"F"+fruits [key].str,0,fruits [key].x,fruits [key].y,100,100,255,0);
     }
  }
}

個人的にもピクチャでいろいろ演出しようと四苦八苦してたことがあり
同じような思考を辿り、同じようなところに限界を感じて
プラグイン化して整理しよう!と覚悟を決めたのはこのあたりがきっかけだった気がします。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by ドラムカン » 2022年5月21日(土) 16:47

WTR 様

いつも大変、お世話になっております。
今回も明朗にご回答くださり、ありがとうございます。

なるほど! その考え方は思いつきませんでした。
ピクチャというよりは、ウェイトに帰属する仕様だったのですね。
ただ、前後に複数の処理があり、並列で回すのは難しいため、別の手で再実行させる方法を模索したいと思います。
ご提案いただいたコードは、今後の参考として有難く頂戴いたします。

WTR様をはじめとしたツクマテの皆さまから、たくさんのご助言をいただいたおかげで、
自身でもプラグインや関数を作れる程度にまで進歩することができました。
この場をお借りして、深くお礼申し上げます。

まだまだ未熟者ですが、WTR様がたどられた道を踏襲しているとのことで、喜ばしく思っております。
このまま学習は続けてまいりますので、今後ともご指導ご鞭撻のほど、よろしくお願い申し上げます。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by Plasma Dark » 2022年5月21日(土) 20:42

特定の規則に従って命名された複数の画像を、ウェイトを挟んで順番に表示したい。
このとき、表示する座標は、何番目に表示する画像であるかによって決まっている。
という前提でお話します。

ウェイトまで含めてプラグインで完結させ、プラグインコマンドやスクリプトからの関数呼び出しのみをイベントコマンドに書きたい、という要求がある場合、やってやれなくはないですが、ツクールのイベントがどうやって逐次実行されているかを理解している必要があります。
そうではなく、ただ名前リストだけ指定して共通の処理をしてくれれば良い、というのであれば、ループをプラグインの中ではなく外に出してしまうことを検討すると良いかと思います。

コード: 全て選択

◆変数の操作:#0003 フルーツリスト = ["A","B","C","D"]
◆ループ
  ◆スクリプト:this.showFruitPicture(
  :     :  $gameVariables.value(3).shift(),
  :     :  3-$gameVariables.value(3).length
  :     :);
  ◆ウェイト:10フレーム
  ◆条件分岐:スクリプト:$gameVariables.value(3).length === 0
    ◆ループの中断
    ◆
  :分岐終了
  ◆
:以上繰り返し
◆文章:なし, ウィンドウ, 下
:  :OK!


コード: 全て選択

(() => {
  'use strict';
  const fruitX = [310, 358, 382, 406];
  const fruitY = 450;

  Game_Interpreter.prototype.showFruitPicture = function (name, index) {
    const pictureId = index+1;
    $gameScreen.showPicture(
      pictureId,
      `F${name}`,
      0,
      fruitX[index],
      fruitY,
      100,
      100,
      255,
      0
    );
  };
})();
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by Plasma Dark » 2022年5月21日(土) 21:03

ウェイトまで含めて完結するプラグインコマンドも、サンプルだけ書きました。
イベント実行の根幹に関わる executeCommand に手を加えているので、プロジェクト次第で何か問題起きるかもしれませんが、特にサポートしません。

https://gist.github.com/elleonard/3b7e0 ... e33abde16e
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by ドラムカン » 2022年5月21日(土) 22:42

Plasma Dark 様

いつも大変、お世話になっております。
解決策のご提案ばかりか、プラグインまで作成していただき、誠にありがとうございます。

イベントコマンドのループを使うとは! 素晴らしいです!
これならば、確実にウエイトを挟み込めますね。

配列もイベントコマンド上で変数に入れ、
showPictureだけを関数化して走らせる! まさに目からうろこです。

オブジェクトリテラルを使うことに固執しており、
x座標の単独配列やピクチャ番号の加算カウントなど、基本的な策を失念していたのも反省点です。

showFruitPicturesWithWaitSample.jsに関しまして、圧巻の一言に尽きます。
どういった処理をしているのか、分からない点はありますが、
要するに、イベントコマンドで示してくださった一連の処理を
すべてプラグイン上で完結させていると言ったところでしょうか。
処理の流れを完璧に把握していなければ書けないだろうと素人目にも何となく汲み取れます。

早速、導入させていただきました。
Plasma Dark様が懸念されておりましたとおり、複数の不具合が出てしまいましたが
コードだけでも非常に参考になるものですので、有難く頂戴させていただきます。

本件は、1つ目にご回答くださった案で解決できそうですので、
ループ部分はイベントコマンド上で行うようにしたいと考えております。

この度は、懇切丁寧にご教示くださり、感謝至極です。
今後とも、何卒よろしくお願い申し上げます。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決済み】スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by Plasma Dark » 2022年5月22日(日) 09:14

解決されたようで何よりです。

複数の不具合が出てしまいましたが


サポートしないとは書きましたが、個人的に興味はあるので、どんな不具合が出たか教えていただけるとありがたいです。
アバター
ドラムカン
記事: 178
登録日時: 2019年11月04日(月) 23:02

Re: 【解決済み】スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by ドラムカン » 2022年5月22日(日) 22:43

Plasma Dark 様

いつもお世話になっております。
ご連絡くださり、ありがとうございます。

何かする度に、60フレームほどウエイトがかかる状態になっておりまして、
メニューを開いたり、NPCに話しかけたりすると、様々なエラーが発生して強制終了になっておりました。
エラーについては、特別、調査してはいないのですが、
コアスクリプトの他に、他のプラグイン名や関数名がコンソールに表示されておりましたので、
干渉もあるかと思います。

ご参考になりましたら幸いです。
アバター
Plasma Dark
記事: 668
登録日時: 2020年2月08日(土) 02:29
連絡を取る:

Re: 【解決済み】スクリプトからピクチャの表示を実行した際の描画処理について

投稿記事by Plasma Dark » 2022年5月26日(木) 11:07

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

何かする度に、60フレームほどウエイトがかかる状態になっておりまして、
メニューを開いたり、NPCに話しかけたりすると、様々なエラーが発生して強制終了になっておりました。
エラーについては、特別、調査してはいないのですが、
コアスクリプトの他に、他のプラグイン名や関数名がコンソールに表示されておりましたので、
干渉もあるかと思います。


流石にこの情報だけでは何もわかりませんが、ひとまずプレーンなプロジェクトでは再現が取れないので、プロジェクト依存の何かではありそうですね。
イベントコマンドのループで解決されているとのことなので、ひとまず深追いはしないことにします。

“MV:質問” へ戻る