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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     return functionへの引数の渡し方
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
nacbox
Åê¹ÆNo.46471
投稿日時: 2010-12-2 16:24
新米
居住地: 東京
投稿: 25
使用環境:
Win7 / Flash CS4 PRO
return functionへの引数の渡し方
ずっとAS2しか使ってこなかったのですが、AS3で処理しないと難しい個所を含むSWFを制作することになり、急遽、AS3をいじり始めています。
内容的には初心者レベルに当たることだと思うのですが、AS3の内容なので、こちらと初心者の部屋のどちらに投稿すべきか悩んでこちらにしました。
不適切だったら申し訳ありません。

やろうとしていること:
画面内に複数のボタンがあり、それぞれインスタンス名が[Btn0]?[Btn9]の連番になっています。
クリックしたボタン内でラベル"on"にジャンプして、一回前にクリックしたボタンをラベル"off"にジャンプさせます。


var prevNum:int = 1;

for (var i:int = 0; i< 10; i++) {
    var iStr = String(i);
    this["Btn" + iStr ].addEventListener(MouseEvent.CLICK , btnClick(i));
}

function btnClick(i_num:int) {
    return function (event:MouseEvent):void{
        var target : MovieClip = MovieClip( event.currentTarget );
        target.gotoAndPlay("on");
        var prevStr = String(prevNum);
        this["Btn" + prevStr ].gotoAndPlay("off");
        prevNum = i_num;
    }
}


このコードを走らせるとエラーになります。
いろいろコメントアウトしたりして原因を探ったところ、グローバル変数である「prevNum」には
function btnClick()内ではアクセスできるものの
return function()内ではアクセスできない、ということではないかと……。
traceでいろいろな場所から出力してみた感じでは、そんな印象でした。

そもそも上記のコードのアプローチが間違っている、という可能性も多分にあるとは思うのですが、まず、return functionの中にグローバル変数を渡す方法はないでしょうか?
また、グローバル変数への代入も行いますので、単に参照するだけではなく、書き換えも必要と思うのですが……。

AS3に触り始めたのが今日、という状況ですので、手探り状態です。
とんちんかんな質問でしたら申し訳ありません。
どなたかアドバイスしてください。
よろしくお願いします。
ひろゆき
Åê¹ÆNo.46472
投稿日時: 2010-12-2 17:20
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: return functionへの引数の渡し方
var prevId:uint;

for (var n:uint = 0; n < 10; n++) {
	var btn:MovieClip = this["btn" + n];
	btn.id = n;
	btn.addEventListener(MouseEvent.CLICK, click, false, 0, true);
}

function click(evt:MouseEvent):void {
	var currentId:uint = evt.target.id;
	var currentBtn:MovieClip = this["btn"+currentId];
	currentBtn.gotoAndPlay("on");
	var prevBtn:MoiveClip = this["btn"+prevId];
	if (prevBtn) prev_btn.gotoAndPlay("off");
	prevId = currentId;
}
とか。


----------------
質問する際は、回答者に具体的な情報を与えてください。

コマツ
Åê¹ÆNo.46473
投稿日時: 2010-12-2 17:21
職人
居住地: 東京都葛飾区
投稿: 356
使用環境:
windows7
CS5.5 CS6
Re: return functionへの引数の渡し方
nacbox さん、こんにちは。

エラーが出るのでしたら、エラーを書くことでレスが付きやすくなるかと思います。
まずは、どんなエラーでるか書いてみてはいかがでしょうか?


var prevNum:int = 1;

for (var i:int = 0; i< 10; i++) {
    var iStr = String(i);
    this["Btn" + iStr ].addEventListener(MouseEvent.CLICK , btnClick(i));
}

function btnClick(i_num:int) {
    return function (event:MouseEvent):void{
        trace(i_num);
    }
}


僕が気になるところは、iという変数が渡す値が目的通りの値
か調べてみて欲しいです。
上記のように、各ボタンを押したときに何のデータを渡しているか確認してみてください。
野中文雄
Åê¹ÆNo.46474
投稿日時: 2010-12-2 17:45
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: return functionへの引数の渡し方
第1に、問題を単純化すべきです。「原因を探」るために、インスタンス10個は要りませんし、フレームを移動する必要もないでしょう。

私の環境では、とくに問題なく変数「prevNum」の値が[出力]されます。なお、「リスナー関数が使う値を外から指定する」をご参照ください。
引用:
nacboxさんは書きました:
やろうとしていること:
画面内に複数のボタンがあり、それぞれインスタンス名が[Btn0]?[Btn9]の連番になっています。
...[中略]...
var prevNum:int = 1;

// for (var i:int = 0; i< 10; i++) {
for (var i:int = 0; i< 2; i++) {
	var iStr = String(i);
	this["Btn" + iStr].addEventListener(MouseEvent.CLICK , btnClick(i));
}

function btnClick(i_num:int) {
	return function (event:MouseEvent):void{
		var target : MovieClip = MovieClip( event.currentTarget );
		// target.gotoAndPlay("on");
		var prevStr = String(prevNum);
		// this["Btn" + prevStr ].gotoAndPlay("off");
		trace(i_num, prevNum);
		prevNum = i_num;
	}
}

このコードを走らせるとエラーになります。
いろいろコメントアウトしたりして原因を探ったところ、グローバル変数である「prevNum」には
function btnClick()内ではアクセスできるものの
return function()内ではアクセスできない、ということではないかと……。


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

coppepam
Åê¹ÆNo.46475
投稿日時: 2010-12-2 17:53
新米
居住地:
投稿: 1
使用環境:
Win Vista, Flash Professional CS5
Re: return functionへの引数の渡し方
nacboxさん こんにちは
そしてみなさんはじめまして。

なるべくnacboxさんのオリジナルのコードを崩さない形で
おそらくnacboxさんの求める結果が出るように修正してみました。
これで慣れてるやり方で進められるのではないかと思います。


var prevNum:int = 1;

for (var i:int = 0; i< 10; i++) {
    this["Btn" + i].addEventListener(MouseEvent.CLICK , btnClick(i));
}

function btnClick(i_num:int) {
    return function (event:MouseEvent):void{
        var target : MovieClip = MovieClip( event.currentTarget );
        target.gotoAndStop("on");
		
	//ここのthisはMainTimelineではなくglobalを参照してましたのでMainTimelineを参照しました
		
        MovieClip(root)["Btn" + prevNum].gotoAndStop("off");
        prevNum = i_num;
    }
}


上記コードでいかがでしょうか?
でも、僕個人としてはひろゆきさんの書かれたようなやり方でやっています。
nacbox
Åê¹ÆNo.48220
投稿日時: 2011-10-20 15:42
新米
居住地: 東京
投稿: 25
使用環境:
Win7 / Flash CS4 PRO
Re: return functionへの引数の渡し方
質問者のnacboxです。
みなさんにお知恵をお借りしておきながら、永らく放置しておりまして、大変申し訳ございません。
伏してお詫び申し上げます。

当初の問題につきましては、みなさんの回答を待つよりも早く、急遽AS2での開発に方針転換することとなり、直近の問題は消滅してしまいました。
その後、皆さまからさまざまなアドバイスを頂いたことは拝見しておりましたが、そのまま目の前に迫った納期を優先してアドバイスを試すことなく時間が経ってしまい、大変恥ずかしながら、そのまま忘れ去ってしまいました。

気付けばAS3で開発する機会も増え、改めて今スレッドを見直してみると、今でしたらひろゆきさんの書かれたようにMCにプロパティを与えて前回クリックしたMCの同定に利用するだろうな、と思います。
というか、最初の質問文に書いたような、回りくどい方法をどうして取ろうとしていたのか、逆に自分でよく分からない状態です。

当時AS3で書きかけていた元のソースが存在しないため、どういったエラーが発生していたのか、今となっては分かりません。
同じような書き方をして実験しても、問題なく値が渡っているようなので、おそらくこのコード以外の部分にも原因があったのだと思います。

時間が経ってしまうと、こうして情報そのものが散逸してしまい、せっかく共有すべきトラブルの解決方法が失われてしまう。
当時、記憶の新しいうちにきちんと実験などを繰り返しておけば、何らかのトラブルシューティングとなったはずと思うと、大変反省しております。
また、当時、お時間を割いていただいて、さまざまアドバイスをくださった皆さんに対して、お礼の言葉も残さずに放置したことも大変申し訳なく思います。

皆様、申し訳ありませんでした。
そして、大変にありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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