[解決済み]ループ外での新しい変数の宣言について、ご教授お願いします。

ごま鍋
記事: 5
登録日時: 2019年1月13日(日) 18:34

[解決済み]ループ外での新しい変数の宣言について、ご教授お願いします。

投稿記事by ごま鍋 » 2019年1月13日(日) 19:59

ごま鍋といいます。

現在、シーンメニューをまっさらにして、あたらしいメニュー画面の作成に挑戦しています。
その際に、「↓」ボタンを押すと変数が1づつカウントされ、その変数の値によって、スキルアイコン等の画像の不透明度を操作する関数を作成しようと思ったのですが、ループ内にて変数の宣言をしていまっているようで、カウント処理が上手く作動しません。
以下のプラグイン内にて、いろんなところで、変数の宣言を試してみましたが、ループ外からの変数の宣言ができませんでした。
考え方が根底から間違っている可能性もあるのですが、もし上手い方法がありましたら、ご教授お願いします。


(function() {
var _Scene_Menu_create = Scene_Menu.prototype.create;
Scene_Menu.prototype.create = function() {
_Scene_Menu_create.call(this);
this.createCommandWindow();//関数の中身削除済み
this.createGoldWindow();//関数の中身削除済み
this.createStatusWindow();//関数の中身削除済み
  //ここから新しい関数
this.createcommandgazou();
};
~元からあった関数の中身を削除処理~
Scene_Menu.prototype.createcommandgazou = function() {
var iconflag =1;//このアイコン変数を宣言する場所がわかりません。今のままではループする度に1が宣言されてしまう?
if(iconflag <= 3)
{
iconflag = iconflag + 1;
}
//以下に画像表示のプログラムを記載しています。
};
//iconflagがループする度に1と宣言されてしまうため、iconflagの中身が2から動かない
})();
最後に編集したユーザー ごま鍋 on 2019年1月14日(月) 18:29 [ 編集 1 回目 ]

ジャングル
記事: 37
登録日時: 2018年12月30日(日) 14:51

Re: ループ外での新しい変数の宣言について、ご教授お願いします。

投稿記事by ジャングル » 2019年1月14日(月) 03:15

クロージャを使っても駄目ですか?(静的変数に保存)
Scene_Menu.prototype.createcommandgazou = (function() {
var iconflag =1;
return function() {
if(iconflag <= 3) {
iconflag = iconflag + 1;
}
};
})();

この場合は、ウィンドウを開くごとにiconflagが更新されていきます(4まで)

グローバルに保存することもできます(どこからでも使えます)
window.iconflag = 1;

一度に、色んな機能を実装しようとせずに、
1つずつ追加していくと確実です。
ごま鍋
記事: 5
登録日時: 2019年1月13日(日) 18:34

Re: ループ外での新しい変数の宣言について、ご教授お願いします。

投稿記事by ごま鍋 » 2019年1月14日(月) 16:52

返信ありがとうございます。
クロージャ機能というものがあったことを知らなかったので、大変勉強になりました。
クロージャ機能等などを調べ、setHandlerを用いて選択肢を選ぶたびに変数を+1する関数を作ったところ
初期化されないで増え続けていくことを確認できました。
ただ、自分が根底から勘違いしていたみたいで
function() {
のすぐ下に変数を宣言すれば、クロージャ等の機能を使用する必要がなかったみたいです。
お騒がせして申し訳ございません。

(function() {
var a = 0;
var _Scene_Menu_create = Scene_Menu.prototype.create;
Scene_Menu.prototype.create = function() {
_Scene_Menu_create.call(this);
this.createCommandWindow();//関数の中身削除済み
this.createGoldWindow();//関数の中身削除済み
this.createStatusWindow();//関数の中身削除済み
this.createCount();
};
Scene_Sample.prototype.createCount =function(){
a = a + 1;
};

ただ、謎が残っていて、上記のようなプログラムを組めば、1/60ごとに勝手に"a"の中身がカウントされると思っていたのですが、実際はsetHandlerを用いなければカウントされませんでした。
"a"が一回しかカウントされず"a"の中身が1で止まってしまうみたいな形です。
今までは、ループの度に変数が宣言されていたので上手くカウントされないと思ってましたが、setHandlerを用いたら上手くカウントできたので、ループの仕方が自分の思っているものではないのかなと、思い直しはじめてきました。
難しいです・・・・
今回の件で、RPGツクールやjavascript、即時関数のことが理解しきれていないと痛感したので、再度勉強しなおします。
ジャングル
記事: 37
登録日時: 2018年12月30日(日) 14:51

Re: ループ外での新しい変数の宣言について、ご教授お願いします。

投稿記事by ジャングル » 2019年1月14日(月) 18:01

どういう機能を実装されるつもりかなのか明確に理解してなかったので、
とりあえず解決できそうなアイデアを2つ書きましたが、
解決されたのであれば良かったです。


>function() {のすぐ下に変数を宣言すれば、

JavaScriptの変数の扱いについて調べた方が良いと思います。
JSは静的スコープなので、関数は定義された環境を含んでいます。
関数内部で変数の値が解決できなければ、スコープチェーンで外に探しにいきます。

JSはletを用いない限りブロックスコープにはなりません。
関数スコープです。
即時関数はスコープの形成のために使われます。


>上記のようなプログラムを組めば、1/60ごとに勝手に"a"の中身がカウントされると思っていたのですが

create()やinitialize()などのメソッドは一度しか呼ばれません。
update()やrefresh()などは何度も呼ばれますけど。

これらはツクールに関する問題ですね。
まあ、先にJSの仕組みを押さえておいた方が良いと思いますが。

解決されて何よりです。
ごま鍋
記事: 5
登録日時: 2019年1月13日(日) 18:34

Re: ループ外での新しい変数の宣言について、ご教授お願いします。

投稿記事by ごま鍋 » 2019年1月14日(月) 18:22

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

initialize()は一度だけしか呼ばれないのかなと思っていましたが、create()が一度しか呼ばれないとは思っていませんでした。
create()の仕組みについて、誤解がとけて大変助かりました。
update()やrefresh()も、そんなに重要視していませんでした・・・

ジャングルさんのおかげで、いろんな誤解がとけて本当に助かりました。
ありがとうございます。

今後も頑張れそうです。

“MV:質問” へ戻る