ページ 12

【解決】変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 19:56
by ムノクラ
下記の要望を読んで、スクリプトの配列とコモンイベントの2つで解決できるんじゃないか?と思って挑戦しました。
変数操作→コモン呼び出しを一行で行うコマンド
viewtopic.php?f=49&t=7870

しかし、上手くいきません。
Syntax errorになってしまいます。

下記を参考に組んでみました。

RPGツクールMVの変数で遊ぶ - drhaisai_blog
http://drhaisai.hatenablog.com/entry/2017/12/11/003518

SS01.png

SS02.png

SS03.png


コモンイベント1:プラグイン代行の中身は下記です。

コード: 全て選択

$gameVariables.setValue($gameVariables.value($gameVariables.value(1)[0]),$gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]);
this.setupChild($dataCommonEvents[$gameVariables.value(1)[2]].list, 0);


どなたか後学のためにご指導ください。

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 20:09
by さすらいのなんちゃら
配列にしたい変数がカンマ区切りになってないと思います。

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 20:17
by ムノクラ
さすらいのなんちゃら さんが書きました:配列にしたい変数がカンマ区切りになってないと思います。

おぉ、抜けていました!
SS04.png
SS04.png (27.13 KiB) 閲覧数: 2368 回

追加したところ、エラーも何も言わなくなりました。

///↓勘違い↓///
SS05.png

と追加してみたら、変数11が0と返ってくるので、スクリプトが動いていないと思われます。
///↑勘違い↑///

実験で消していたコモンイベントのスクリプトがない状態でテストしていました。
コモンイベントは動きましたが、変数は0でした。

変数の処理に文法的に無理はないのでしょうか?
配列から取った数字のつもりが、文字列扱いされているとか…

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 20:19
by astral
こんばんは。
何がうまくいかなかったか書いてもらわないとわかりにくいですが、
まず配列は,区切りなので、['11', '-10', '2']としないとエラーとなっているはずです。

>$gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]
'11'は文字列の扱いなので、 '11' + '-10'で計算した場合は文字列の結合で'11-10'となります。
数値の場合は、[11, -10, 2]です

あとこれだと変数11番の値に対して-10をするという意味になるのですが意図した挙動でしょうか。

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 20:28
by ムノクラ
astral さんが書きました:こんばんは。
何がうまくいかなかったか書いてもらわないとわかりにくいですが、
まず配列は,区切りなので、['11', '-10', '2']としないとエラーとなっているはずです。

>$gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]
'11'は文字列の扱いなので、 '11' + '-10'で計算した場合は文字列の結合で'11-10'となります。
数値の場合は、[11, -10, 2]です

あとこれだと変数11番の値に対して-10をするという意味になるのですが意図した挙動でしょうか。


配列を,区切りにすることでエラーは出なくなりました。
変数11番から-10して、結果的に-10という答えを出させるつもりで作っています。

文字列扱いになってしまうのですね。
でも、戻ってきた変数11番の値は0でした。

クォーテーションを外しても結果は同じでした。

でも、先の投稿ミスを修正したように、コモンイベントの番号としては動いているようです。
コモンイベントの番号は文字列でも合っていれば動いてしまうのですかね?<JavaScript仕様的に

いっそ、変数を介さないで、スクリプトで配列を指定したほうが良いのでしょうか?

var array = [11, -10, 2];

https://www.sejuku.net/blog/31746

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 20:49
by astral
>$gameVariables.setValue($gameVariables.value($gameVariables.value(1)[0]),$gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]);

まずsetValueの変数番号の指定が、
>$gameVariables.value($gameVariables.value(1)[0])
となり、この場合変数11番の値であるので、画像内では変数11番になにか値を代入する記述がないので、変数11番は初期状態の0のままなので正常です。

変数11番が-10になる想定なら、こういうことでしょうか。

コード: 全て選択

$gameVariables.setValue($gameVariables.value(1)[0], $gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]);

配列の数値は内部的に文字列に変換されているので、
$dataCommonEvents['2']にするのは問題ないです。

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 21:40
by ムノクラ
astral さんが書きました:変数11番が-10になる想定なら、こういうことでしょうか。

コード: 全て選択

$gameVariables.setValue($gameVariables.value(1)[0], $gameVariables.value($gameVariables.value(1)[0])+$gameVariables.value(1)[1]);



変数へ代入する配列を
[11, -10, 2]
として、いただいたスクリプトに差し替えたところ、変数11番に-10が返ってきました。

希望の動きなのですが、なんだかしっくり来ません。
というのは、
自分が
$gameVariables.value($gameVariables.value(1)[0])
と書いたところが、正しくは

$gameVariables.value(1)[0]
というように、入れ子が多いということのようですが、動いている記述だと、変数1[0]というように見えるのですが、そういうものだと理解するのがしぜんということでしょうか。
JavaScriptをもっと深く理解すれば、当たり前のことなんでしょうか?

このまま、変数を使わないで、
スクリプト:var array = [11, -10, 2];
で行った場合のスクリプトも教えていただいてもよろしいでしょうか?

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 21:55
by さすらいのなんちゃら
代入先の変数番号が$gameVariables.value($gameVariables.value(1)[0])→変数番11→0になってるからおかしな事になっているのでは?

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 21:59
by ムノクラ
さすらいのなんちゃら さんが書きました:代入先の変数番号が$gameVariables.value($gameVariables.value(1)[0])→変数番11→0になってるからおかしな事になっているのでは?


何となく分かってきたような気がしてきました。
もう少し考えてみます。

Re: 変数で配列を利用して、スクリプトを動かしたい

Posted: 2019年5月28日(火) 22:02
by astral
>入れ子が多いということのようですが、動いている記述だと、変数1[0]というように見えるのですが、そういうものだと理解するのがしぜんということでしょうか。

入れ子が多いというより、$gameVariables.setValueや$gameVariables.valueの仕様の認識の違いのような気がします。

配列を直接指定する場合にも対応して、わかりやすく書くとこういう感じでしょうか。

コード: 全て選択

var array = $gameVariables.value(1);
var id = array[0];
var value = $gameVariables.value(id) + array[1];
$gameVariables.setValue(id, value);

var event = $dataCommonEvents[array[2]];
if (event) {//存在しないコモンイベントIDの場合のエラー対策
    this.setupChild(event.list, 0);
}

配列を直接指定する場合は、先頭を
var array = [11, -10, 2];
に置き換えてください。