【解決済】イベントコマンドのスクリプト記述について

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

【解決済】イベントコマンドのスクリプト記述について

投稿記事by WTR » 2017年12月12日(火) 00:36

質問です。

慣れるとスクリプトのほうが便利なことが多いので多用してるのですが
いくつか記述で不明なことがあるので教えて頂けますでしょうか。

あまり影響はないと思いますが補足で
viewtopic.php?t=813
↑こちらのプラグインを使用させて頂いて、ながーいスクリプト書いています。

① waitの記述

以前もハマったのでスクリプトで書くのを避けてるのですが後学のために…

var i;
for (i = 0; i < 10; i++){
-------処理-------
this.wait(10);
}

と記述すると、処理を10回繰り返してから wait 10 が入る気がします。
for ループの間、毎回 wait 10 を入れたい場合はどう記述すればよいでしょうか。

② コモンイベントの呼び出しについて

http://rpgmaker-script-wiki.xyz/common_mv.php
↑参考にさせていただいているのですが

this.setupChild($dataCommonEvents[1].list, 0);
this.setupChild($dataCommonEvents[2].list, 0);

と書くと、コモンイベント2だけが実行されます。
スクリプトを分ければどちらも実行されるのですが
if や switch の中でコモンイベント呼び出ししてたりして、続けて書きたいことがあるので
1回で書くことができるなら方法が知りたいです。

③ プラグインコマンドの記述について

プラグインコマンドをスクリプトで記述して、さらに引数をゲーム変数で書けないでしょうか。

var arg = new Array ($gameVariables.value(1), '0', "test");
this.pluginCommand("PLUGIN_COMMAND", arg);

とかこんな記述したいんですが、'$gameVariables.value(1)' もしくは "$gameVariables.value(1)" じゃないと
エラーになり、でもそうするとどちらも正しく変数の値が反映されず…

長くて申し訳ないですが
どれも出来たら幅が広がるので是非教えていただきたいです。
よろしくお願いいたします。
最後に編集したユーザー WTR on 2017年12月17日(日) 17:51 [ 編集 1 回目 ]

Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
しぐれん
記事: 972
登録日時: 2017年3月28日(火) 22:22
連絡を取る:

Re: イベントコマンドのスクリプト記述について

投稿記事by しぐれん » 2017年12月12日(火) 04:16

この辺はGame_Interpreterクラスの動きが関わってきます。
前提としてwaitとイベントの呼び出しは特別なイベントコマンドと言っておきます。
イベントコマンド「スクリプト」も特別な命令です。(中身はJavaScriptのevalを実行しているだけですが)

インタプリタの実行はイベントコマンドの配列とindexで行われています。
イベントコマンドを一つ実行するたびにindexを1ずつ増やしていき、配列の最期になったらイベントが終わります。
このindexは「プログラムカウンタ」に相当します。

(1)これは面倒ですが、イベントコマンドを分けるしかないです。
forの中で複数回waitは無理です。
waitの内部実装ですが、waitの数値が0より大きい場合、インタプリタを中断して他の並列で動いているイベントやゲームの更新に処理を移します。

また、スクリプトの実行部分はevalで行われているために中断しても戻ってくる場所がありません。
なぜ戻れないかと言えば、プログラムカウンタを記録できないからです。
(このプログラムカウンタは前述のindexとは別で、機械語レベルに近い低レイヤーの処理です)

(2)について
やるとしたら、スクリプトの大改造が必要ですが、タスクシステム的なものを組む必要があります。
このあたりはC++など普通のプログラミング言語でシューティングを作ると理解できるかもしれません。
一般的にSTGでは弾や敵キャラの動きを一つのタスクと考えて動かします。

つまるところ、イベントを送り込むと自動実行するようなクラスを作る必要があります。
また、このイベントのセーブ機構も必要になります。

(3)
速度的には微妙ですが、array.join()という手があります。
この関数は、配列の要素を全て文字列にして、任意の区切り文字を間に挟んで連結します。
現在、プラグイン依頼はお休み中です。
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: イベントコマンドのスクリプト記述について

投稿記事by 奏ねこま » 2017年12月12日(火) 04:24

■①②の回答

基本的に無理です。
waitもsetChildも、そのあと実行するための準備をしているだけで、その場で実行するものではありません。
基本的にと言いましたが、これを実現するにはけっこうな労力が必要です。

■③の回答

String($gameVariables.value(1))としたらどうでしょう?
アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: イベントコマンドのスクリプト記述について

投稿記事by WTR » 2017年12月12日(火) 13:01

お二方ともありがとうございます。

①②は、まぁ無理とわかっただけでもよかったです。
逃げ道はあるので諦めます。

③も何度か書きたい場面があったけど回りくどい逃げ方していたので助かります。
どちらも文字列に変換して、という感じですよね。帰ったら試してみます。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: 【解決済】イベントコマンドのスクリプト記述について

投稿記事by WTR » 2017年12月17日(日) 17:54

③のプラグインコマンドの記述、できました。
ありがとうございます。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/

“MV:質問” へ戻る