- ベストアンサー
ActionScript3: for文でのTween割り当てについて
- AS3でfor文を使用して複数のボタンにTweenを割り当てる方法を試していますが、最後のボタンしか動作しません。
- ボタンをマウスオーバーするとTweenアニメーションで動き、マウスアウトすると元の位置に戻る機能を持ったボタンを作成したいです。
- Tweenはfor文で割り当てられないのでしょうか?詳しい方、ご教示ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#4(#2) です。 > 親のムービークリップbtn01に幅、高さを付けるためなのですか? 違います。 親ムービークリップ内に何かを用意すると それが親ムービークリップであるということになるからです。 「田中君の敷地内の家具」 は 「田中君の敷地」=「田中君の敷地内にあるもの」 でしょう? 「田中君の敷地内のハナレ(別棟)」 も 「田中君の敷地」=「田中君の家の敷地内にあるもの」 でしょう? 「田中君が所有する別荘」 も 「田中君の敷地」=「田中君の敷地内にあるもの」 でしょう? ↓上記mp 田中君の敷地 を ムービークリップ に変換します↓ 「ムービークリップ内のインスタンス」 は 「ムービークリップ」=「ムービークリップ自体にあるもの」 でしょう? 「ムービークリップ内の別インスタンス」 も 「ムービークリップ内」=「ムービークリップ自体にあるもの」でしょう? 「ムービークリップ内にある他の物」も 「ムービークリップ」=「ムービークリップ内自体にあるもの」でしょう? > 透明なシンボルは必要ないような気がするのですが? 透明なシンボルではありません。 また 透明なインスタンス でもありません。 別に「透明なインスタンス(シンボル?)」であってもかまいませんが, 特に インスタンス(シンボル?) である必要はありません。 「何か」です。 「何か」ですから「透明な塗り」で十分です。 「ココは田中君の敷地ですよ」=「ここはムービークリップ内ですよ」 ということを表すものです。
その他の回答 (4)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
#2です。 #2の最後を繰り返しますよ。 > ※ボタンMC(ムービークリップ)を直接動かしているので ~略~ > 親ムービークリップにロールオーバーしたときに > 子ボタンMCを Tween させる。 ですよ。 透明な塗りをムービークリップ内に作成してもそれごと直接動かしたら意味がないでしょう? それだと「ボタンMC(ムービークリップ)を直接動かしている」状態そのままで何の進化もしてません。 例えば, シンボル「btn01」内のボタンの絵をムービークリップに変換して 例えば「mc」というインスタンス名を付けます。 その「mc」の下のレイヤーにでも透明な塗りを描けば良いのです。 そして 「btn01」のインスタンス自体を動かすのではなく 「btn01」内の「mc」を動かすのです。 (他の 「btn0○」 も同じく。) ---------------- //クラスのインポート import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; //変数色々設定 var Top:int=-41; var Bottom:uint=0; var MovSpd:Number=0.2; var BtnTween01:Tween; var BtnTween02:Tween; //ボタン配置 for (var i:uint=1; i<6; i++) { var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); addChild(Btn); Btn.x=10+Btn.width/2+(Btn.width+10)*(i-1); Btn.y=46+Btn.height/2; Btn.buttonMode=true; Btn.addEventListener(MouseEvent.ROLL_OVER, RollOverEv); Btn.addEventListener(MouseEvent.ROLL_OUT, RollOutEv); } function RollOverEv(eventObject:MouseEvent):void { BtnTween01=new Tween(eventObject.target.mc,"y",None.easeNone,Bottom,Top,MovSpd,true); if (BtnTween02!=null&&BtnTween02.isPlaying) { BtnTween01=new Tween(eventObject.target.mc,"y",None.easeNone,BtnTween02.position,Top,MovSpd,true); } } function RollOutEv(eventObject:MouseEvent):void { BtnTween02=new Tween(eventObject.target.mc,"y",None.easeNone,Top,Bottom,MovSpd,true); if (BtnTween01.isPlaying) { BtnTween02=new Tween(eventObject.target.mc,"y",None.easeNone,BtnTween01.position,Bottom,MovSpd,true); } } ---------------- 変更箇所は //変数色々設定 の数値と BtnTween01=new Tween(eventObject.target.mc,"y",None.easeNone,Bottom,Top,MovSpd,true); などの eventObject.target.mc の部分です。 良い副産物的効果として, //変数色々設定 を上にもって行くことが可能になりました。 相対座標ですから,呼びだした Btn の位置をうかがう必要はないということです。
- H240S18B73
- ベストアンサー率65% (190/288)
#1です 言ってる事はあってたけど 解決してませんでした、すいません 結局おなじの参照する結果になってました あと、おせっかいですが Tweenクラスは複数のTweenで ターゲットがだぶってても なんも解決処理してくれません しかもターゲットがだぶってる所為で 変な動作してくれることがあります なんで同じBtnに対しては 行き帰りで二つに分けず Tweenは一つにして continueTo()とかで繋いだ方が 安定するかもしれません ロールオーバー、アウトの度に 新たにインスタンス作っちゃうのも なんかいらないゴミが増えそうです //クラスのインポート import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; //先に変数作っておく var MovSpd:Number=0.2; //ボタン配置 for (var i:uint=1; i<6; i++) { var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); Btn.x=10+Btn.width/2+(Btn.width+10)*(i-1); Btn.y=46+Btn.height/2; Btn.buttonMode=true; addChild(Btn) Btn.tween=makeTween(Btn) Btn.addEventListener(MouseEvent.ROLL_OVER, RollOverEv); Btn.addEventListener(MouseEvent.ROLL_OUT, RollOutEv); function RollOverEv(eventObject:MouseEvent):void { var tgt=eventObject.target //TweenをひとつにまとめてcontinueToを使えば //positionを取得したりしなくてもいいし楽です tgt.tween.continueTo(tgt.height/2+5,MovSpd) } function RollOutEv(eventObject:MouseEvent):void { var tgt=eventObject.target tgt.tween.continueTo(tgt.height/2+46,MovSpd) } } //Tweenを関数で作らせてワンクッッション置く事で //ターゲットの参照が変わってしまうのを避けます function makeTween(tgt:MovieClip):Tween{ //Tween作る時点ではターゲットとプロパティ、初期値 //ミリ秒使うかとだけ設定されてたらOK var rtn=new Tween(tgt,"y",None.easeNone,tgt.y,tgt.y,0,true); rtn.stop() return rtn }
補足
>あと、おせっかいですが いえいえ、そういう指摘はどんどんしてほしいです。continueTo()とは思いつきませんでした。 アニメーション中に処理を実行しない場合はcontinueTo()とかが有効ですね。 Btn.tween=makeTween(Btn) function makeTween(tgt:MovieClip):Tween{ var rtn=new Tween(tgt,"y",None.easeNone,tgt.y,tgt.y,0,true); rtn.stop() return rtn } こうやって関数でTween作れたんですね、プロパティに.Tweenとか戻り値型にもTweenってあたんですね。自分の持っている http://www.amazon.co.jp/ActionScript-3-0%E8%BE%9E%E5%85%B8-FlashPlayer10-9%E5%AF%BE%E5%BF%9C-%E3%81%AE%E3%82%8A%E3%82%86%E3%81%8D/dp/4798119016/ref=sr_1_14?ie=UTF8&s=books&qid=1266313639&sr=1-14 には載っていませんね。他にも戻り値型にFunctionがあったりと戻り値型にはけっこう種類があるんですか?
- BlurFiltan
- ベストアンサー率91% (1611/1754)
こんな感じで良いのではないでしょうか? ---------------- //クラスのインポート import fl.transitions.Tween; import fl.transitions.TweenEvent; import fl.transitions.easing.*; var BtnTween01:Tween; var BtnTween02:Tween; //ボタン配置 for (var i:uint=1; i<6; i++) { var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); addChild(Btn); Btn.x=10+Btn.width/2+(Btn.width+10)*(i-1); Btn.y=46+Btn.height/2; Btn.buttonMode=true; Btn.addEventListener(MouseEvent.ROLL_OVER, RollOverEv); Btn.addEventListener(MouseEvent.ROLL_OUT, RollOutEv); } function RollOverEv(eventObject:MouseEvent):void { BtnTween01=new Tween(eventObject.target,"y",None.easeNone,Bottom,Top,MovSpd,true); if (BtnTween02 != null && BtnTween02.isPlaying) { BtnTween01=new Tween(eventObject.target,"y",None.easeNone,BtnTween02.position,Top,MovSpd,true); } } function RollOutEv(eventObject:MouseEvent):void { BtnTween02=new Tween(eventObject.target,"y",None.easeNone,Top,Bottom,MovSpd,true); if (BtnTween01.isPlaying) { BtnTween02=new Tween(eventObject.target,"y",None.easeNone,BtnTween01.position,Bottom,MovSpd,true); } } //変数色々設定 var Top:uint=Btn.height/2+5; var Bottom:uint=Btn.height/2+46; var MovSpd:Number=0.2; ---------------- 全体的に配置を変えていますが,それはあまり大したことはありません。 重要な変更点は BtnTween01=new Tween(Btn,"y",None.easeNone,Bottom,Top,MovSpd,true); ↓ BtnTween01=new Tween(eventObject.target,"y",None.easeNone,Bottom,Top,MovSpd,true); です。 いくつかある同様の箇所の Btn も eventObject.target に変更しています。 書かれていらっしゃるスクリプトだと 変数 Btn はコロコロ変わるのですから 最終的に Btn に代入されたものが Btn の参照するインスタンスになります。 イベントリスナーで実行される関数には引数が必ず必要ですよね。 上のように変更して考えれば,その存在意味がわかると思います。 ※ボタンMC(ムービークリップ)を直接動かしているので ロールオーバーしてもすぐにロールアウトするため動きが変になります。 ムービークリップ内に透明な塗りのヒットエリアでも用意した親MCを用意し その中に子ボタンMCを入れておいて 親ムービークリップにロールオーバーしたときに子ボタンMCを Tween させる。 などの工夫をした方が良いかもしれません(あくまでも工夫例の1つです)。
補足
なるほどeventObject.targetを使えばよいのですね、でも確かにボタンの動きが上下に忙しなく動いて狙い通りではないですね。「ムービークリップ内に透明な塗りのヒットエリアでも用意した親MCを用意しその中に子ボタンMCを入れておいて」をやってみました。 for (var i:uint=1; i<6; i++) { var Par:MovieClip = new ParBtn(); addChild(Par);←-----------------親MC var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); Par.addChild(Btn); var Area:MovieClip = new BtnArea(); Par.addChild(Area);←------------透明MC Par.x=10+Area.width/2+(Area.width+10)*(i-1); Par.y=46+Area.height/2; Area.buttonMode=true; Area.addEventListener(MouseEvent.ROLL_OVER, RollOverEv); Area.addEventListener(MouseEvent.ROLL_OUT, RollOutEv); 以下続く..で、 new Tween(eventObject.target,"y",None.easeNone,Bottom,Top,MovSpd,true); ↑このターゲットをボタンにしたいのですがeventObject.targetだと透明MCが動いてしまいます。このような場合はどうターゲットを指定してあげればよいでしょう?
- H240S18B73
- ベストアンサー率65% (190/288)
多分Tweenのターゲットは変数を参照って形になってて 変数の値となってるオブジェクトまでたどってないのでしょうね とすれば、後から参照が変更されるような 変数をターゲットにしないようにすりゃいいわけですよ for (var i:uint=1; i<6; i++) { var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); addChild(Btn); ↓ var BtnList=new Array() for (var i:uint=1; i<6; i++) { var BtnName:String="btn0"+i; var BtnNumber:Class=getDefinitionByName(BtnName) as Class; var Btn:MovieClip = new BtnNumber(); BtnList.push(addChild(Btn)); BtnTween01=new Tween(Btn,"y",None.easeNone,BtnTween02.position,Top,MovSpd,true); ↓ BtnTween01=new Tween(BtnList[i],"y",None.easeNone,BtnTween02.position,Top,MovSpd,true); 後のTweenコンストラクタも同じようなカンジで
補足
ボタンムービークリップの下に透明な塗りを描くのは、親のムービークリップbtn01に幅、高さを付けるためなのですか?btn01にマウスオーバーして中にあるボタンムービークリップを動かすということでは、透明なシンボルは必要ないような気がするのですが?