トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     for文とボタンアクション
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
gigit
Åê¹ÆNo.11262
投稿日時: 2004-10-3 19:18
新米
居住地: tokyo
投稿: 2
使用環境:
WinXP,Flash MX
Mac OS9,Flash MX
for文とボタンアクション
現在、以下のようなものを作成しています。

・ボタンを配置したムービークリップを30個配置。
・ムービークリップのシンボル名には、ID番号を振っている。(mc1、mc2?mc30)
・ボタンのシンボル名は、すべてbt。
・ボタンを押すと、そのボタンを格納しているムービークリップのID番号と同じ数字をtraceで表示。

※ちなみに最終的には、この雛形を流用してムービークリップのID番号と同じIDを持つ外部SWFファイルを呼び出す仕組みにしようと思っています。

というわけで、ボタンを配置しているフレームに、以下のようなスクリプトを記述しました。

-----------------------------------------

SetBt();

function SetBt(){
 for(i=1;i<31;i++){
  this["mc"+i].bt.onPress=function(){
   trace(i);
  }
 }
}

-----------------------------------------

しかし、これだとどのボタンを押しても、
「31」と表示されてしまいます。
根本的に何かの解釈が間違っていると思うのですが、
どういう方向で解決してよいか分からず、
すこし悩んでおります。
どなたかご教授いただけますでしょうか。

どうぞよろしくお願いいたします。


----------------
---------
gigit

野中文雄
Åê¹ÆNo.11263
投稿日時: 2004-10-3 20:39
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: for文とボタンアクション
用語として、「シンボル名」と「インスタンス名」は、区別しましょう。「シンボル名」は、ActionScriptの制御対象にはなりません。
引用:
gigitさんは書きました:
・ボタンを配置したムービークリップを30個配置。
・ムービークリップのシンボル名には、ID番号を振っている。(mc1、mc2?mc30)
・ボタンのシンボル名は、すべてbt。
・ボタンを押すと、そのボタンを格納しているムービークリップのID番号と同じ数字をtraceで表示。

以下のスクリプトから判断するかぎり、Buttonを配置している(つまりButtonが格納されたMovieClipシンボル内の)フレームではなく、Buttonを格納したMovieClipが配置されているタイムラインのフレームアクションだと思われます。その前提で、回答いたしします。
引用:
というわけで、ボタンを配置しているフレームに、以下のようなスクリプトを記述しました。

フレームアクションの最終行にステートメントを加えると、現状がおわかりになるでしょう。
SetBt();

function SetBt(){
 for(i=1;i<31;i++){
  this["mc"+i].bt.onPress=function(){
   trace(i);  // 変数iはどこの値?
  }
 }
}
i = "I am in "+this;

いってみれば、お小遣いをあげるのに、同一口座(タイムライン)のキャッシュカード(変数i)を複数枚つくって渡しているような状況です。そうではなく、各自の口座にお金を降込んであげる必要があります。
引用:
しかし、これだとどのボタンを押しても、
「31」と表示されてしまいます。
根本的に何かの解釈が間違っていると思うのですが、
どういう方向で解決してよいか分からず、
すこし悩んでおります。

SetBt();
function SetBt() {
    for (i=1; i<4; i++) {
        var _mc = this["mc"+i];
        _mc.i = i;  // 各自の口座に入金
        // this["mc"+i].bt.onPress = function() {
        _mc.bt.onPress = function() {
            // trace(i);
            trace(this._parent.i);  // 各口座の残高を見る
        };
    }
}


----------------
 

salvox
Åê¹ÆNo.11319
投稿日時: 2004-10-6 4:14
常連
居住地: 東京都
投稿: 73
使用環境:
Windows2000
FlashMX
テキストエディター:EmEditor
これは、僕も陥った
ど?も、たまにカキコしているSalvox(サルヴォックス)です。

あ?、確かに僕も最初の頃は、これに躓いてました。
多分、殆どの人が一往に躓いているんじゃないかと思うのですが。

多分 gigitさんの中では、

// ↓この 変数『 i 』
for( i=0; i<31; i++ ){
}



// ↓この 変数『 i 』
this['mc0'....'mc31'].bt.onPress = function(){
   trace(i);
};

が、同じものだと思ってませんか?(僕も初めは思ってました。)
でも、実際は二つの変数『 i 』は、全く別もので

  for( i=0; i<31; i++ ){}

↑この変数『 i 』は関数中で出てきていますが、
ローカル変数は、var宣言しないとローカル変数にならないので、
この変数『 i 』は、

  for( this.i=0; this.i<31; this.i++ ){}
  

と書いてるのと一緒の意味になります。

で、、

this['mc0'....'mc31'].bt.onPress = function(){
   trace(i);
};

↑こちらの変数『i』は、
こちらも、onPress = function()←関数宣言中で
『i』が出てきてるにも関わらず、var宣言していないので、
ローカル変数にはならず、

  // mc0だった場合は・・・
  this['mc0'].bt.onPress = function(){
     trace(this.mc0.bt.i);
  };

  // mc1だった場合は、、
  this['mc1'].bt.onPress = function(){
     trace(this.mc1.bt.i);
  };

と書いてるのと同じ意味になります。

つまり、for文の『i』は、『this』直下の『i』を指してるのに対しonPress = functon() 内の『i』は、this.mc0,,,31.bt直下の『i』変数を指してるので、for文でカウントアップされた変数『i』の値は、全く、onPress = functon()内の『i』には、影響を与えてないことになるんです。

では何故、31と表示されるか!?

this.mc0.btのボタンアクションを実行すると、
for文で定義された trace(i); ってのが呼ばれるんですが、
この『i』は this.mc0.bt.iの『 i 』で、それは、呼び出されただけで、初期化も、宣言もされてないので値はundefined、もしくは、メモリー上にすら存在しない。

普通ならコンパイルエラーさ。

でも、Flashは気が利いてるというか、余計な処理なのか、
どこかで変数『i』が宣言されてないか探してくれるんですよ。
で、、先ほどの、、


  for( i = 0; i<31; i++ )
  


↑ なんと!! i = 0; と立派に宣言され、かつ初期化まで
されて、おまけに、i++ とインクリメントまでされてる変数が
ある!! ここだ!! っと、Flashはお利口にも、余計に

『this.mc0.bt.i を this.i でしょう?』
『あんた書き間違えたんだよね?』

と、言わんばかりに、取得し、
結果 31 が表示されると。

如何でしょう?
最初は分かりづらいかも知れませんが、
その内慣れますよ(^^ ;)。


----------------
(C)SalvoxStudioStation

野中文雄
Åê¹ÆNo.11320
投稿日時: 2004-10-6 9:58
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: デフォルト参照とthis参照
結論は、そのとおりです。ただ、以下の部分が、少しニュアンスが違うように思います。

タイムラインに名前のないfunction(イベントハンドラメソッドなど)を定義すると、ターゲットのないデフォルト参照this参照とが分離します。以下のフレームアクション、MovieClipインスタンスmy_mcを配置したタイムラインに設定して、結果をご覧ください。
// タイムラインにMovieClipインスタンスmy_mcを配置
// フレームアクション
this.my_mc.onPress = function() {
    trace("デフォルト参照は: "+valueOf());
    trace("this参照は: "+this);
    _x += 10;
    this._x -= 10;
};

引用:
salvoxさんは書きました:
this['mc0'....'mc31'].bt.onPress = function(){
   trace(i);
};

↑こちらの変数『i』は、
こちらも、onPress = function()←関数宣言中で
『i』が出てきてるにも関わらず、var宣言していないので、
ローカル変数にはならず、

  // mc0だった場合は・・・
  this['mc0'].bt.onPress = function(){
     trace(this.mc0.bt.i);
  };

  // mc1だった場合は、、
  this['mc1'].bt.onPress = function(){
     trace(this.mc1.bt.i);
  };

と書いてるのと同じ意味になります。

つまり、for文の『i』は、『this』直下の『i』を指してるのに対しonPress = functon() 内の『i』は、this.mc0,,,31.bt直下の『i』変数を指してるので、for文でカウントアップされた変数『i』の値は、全く、onPress = functon()内の『i』には、影響を与えてないことになるんです。


----------------
 

youich
Åê¹ÆNo.11322
投稿日時: 2004-10-6 10:44
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: これは、僕も陥った
引用:


多分 gigitさんの中では、

// ↓この 変数『 i 』
for( i=0; i<31; i++ ){
}



// ↓この 変数『 i 』
this['mc0'....'mc31'].bt.onPress = function(){
   trace(i);
};

が、同じものだと思ってませんか?(僕も初めは思ってました。)
でも、実際は二つの変数『 i 』は、全く別もので

あれ、この二つの変数『 i 』は同じものですよ?
Flashの場合、変数のスコープは簡単に言ってしまうと、
ローカル(activationObjectも含む)
ムービークリップ(タイムラインも含む)、
グローバルですね、
そして関数は定義された場所のスコープを持ちます。


引用:


this['mc0'....'mc31'].bt.onPress = function(){
   trace(i);
};

↑こちらの変数『i』は、
こちらも、onPress = function()←関数宣言中で
『i』が出てきてるにも関わらず、var宣言していないので、
ローカル変数にはならず、

  // mc0だった場合は・・・
  this['mc0'].bt.onPress = function(){
     trace(this.mc0.bt.i);
  };

  // mc1だった場合は、、
  this['mc1'].bt.onPress = function(){
     trace(this.mc1.bt.i);
  };

と書いてるのと同じ意味になります。


だからここ↑は、、、

  // mc0だった場合は・・・
  this['mc0'].bt.onPress = function(){
     trace(this._parent._parent.i);
  };

  // mc1だった場合は、、
  this['mc1'].bt.onPress = function(){
     trace(this._parent._parent.i);
  };

と書いてるのと同じ意味ですね。


----------------
- yo

gigit
Åê¹ÆNo.11331
投稿日時: 2004-10-6 21:30
新米
居住地: tokyo
投稿: 2
使用環境:
WinXP,Flash MX
Mac OS9,Flash MX
ありがとうございました。
お返事が遅れて申し訳ありません。

>野中さん
早速のご回答、ありがとうございました。
おかげで解決いたしました。
なんとか希望のものが作れそうです。
あと、仕組みの説明も大変分かりやすくて、
次回以降、いろいろと応用できそうです。

用語関係で紛らわしい表現をしてしまい、
すみませんでした。
今度からは正しい用語を使うように心がけます。

>salvoxさん、youichさん
こちらも補足説明ありがとうございました。
変数を持たせる場所がよくわかってなかったようですが、
一連のご説明でなんとなく理屈は分かった気がしますので、
あとはスクリプトを他で応用しながら
感覚的に身につけていこうと思います。

本当にどうもありがとうございました。


----------------
---------
gigit

salvox
Åê¹ÆNo.11441
投稿日時: 2004-10-12 4:16
常連
居住地: 東京都
投稿: 73
使用環境:
Windows2000
FlashMX
テキストエディター:EmEditor
m(_ _)m 勉強不足でした。
>> 野中さん, youichさん, gigiさん

返事遅れて申し訳ありません。
野中さんの言われたやつ試してみました。

なるほど。
勉強不足でしたm(_ _)m
>> gigiさん申し訳ない。適当なこと言ってしまって。

デフォルト参照は、
そのスクリプトが書かれたタイムラインを参照するんですね。
全くねじれて(,,っというか思い込みで)解釈していました。

一つ勉強。


----------------
(C)SalvoxStudioStation

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops