- ベストアンサー
Actionscript3.0の相対パス・絶対パスについて
- AS3.0における相対パス・絶対パスについて質問です。フラッシュページの作成で困っています。
- 【menus】と【contents】がある状態で、【btn2】から【contents】に命令を出す方法を教えてください。
- 質問内容: Actionscript3.0の相対パス・絶対パスについて困っています。【btn2】から【contents】に命令を出す方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1 です 今回のこととは直接関係がない(動作するしないとは関係がない)ことですが, 先日書いたスクリプトは間違ってはいませんが "変" です。 すみません。 その訂正からさせていただきます。 クロージャ である方は for文 ループの中に入れる必要はないんです。 入れてもエラーや不具合が生じることはありませんが無駄です。 したがって, #1の補足で書かれていらっしゃるスクリプト↓ ---------------------------- for(var i:int = 1; i <= 7; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,conMV(i)); function conMV(num:int):Function { return function():void{ var conMV:Tween = new Tween(MovieClip(root).contents, "x", None.easeInOut, contents_x, "con_x" + num, 1, true); } } } ---------------------------- これの クロージャ 部分を for文 から外に出した形をまず書きます↓。 ---------------------------- for(var i:int = 1; i <= 7; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,conMV(i)); } function conMV(num:int):Function { return function():void{ var conMV:Tween = new Tween(MovieClip(root).contents, "x", None.easeInOut, contents_x, "con_x" + num, 1, true); }; } ---------------------------- さて本題です。 この new Tween() 内の 第5引数 「"con_x" + num」 は文字列です。 単なる 文字列 であって 座標にも何にもなっていません。 new Tween() の次の行かまたは new Tween() の行を消して trace("con_x" + num); と書いて 制御→ムービープレビュー すると 「con_x2」 とか 「con_x4」 などが出力 されるはずです。 決して 「- 1000」 や 「- 2000」 などのような数は出力されないはずです。 色々考えてみたのですが, とりあえず クロージャの中に 目標座標 も入れてしまうのが良いと思います。 それと ご質問内容などなどを色々重ね合わせてみた結果 結論として,次のようにしたいのではないだろうかと思いました↓。 --------------------------------- for(var i:int = 1; i <= 6; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,conMV(i , this["con_x"+ i])); } function conMV(num:int,con_x:int):Function { return function():void{ var conMV:Tween = new Tween(MovieClip(root).contents, "x", None.easeInOut, MovieClip(root).contents.x, con_x, 1, true); }; } --------------------------------- うまく行かなかった原因はパスの問題ではないと思います。
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
階層は次のようになっているということですよね。 root ├menus │ ├menu1 │ │ ├btn1 │ │ ├btn2 ☆クリック↓ │ │ ├btn3 │ │ ├btn4 ★クリック↓ │ │ ├btn5 │ │ └btn6 │ ├menu2 │ │ ├btn1 │ │ ~ ~ │ │ └btn6 │ ├menu3 │ │ ├btn1 │ │ ~ ~ │ │ └btn6 │ ├menu4 │ │ ├btn1 │ │ ~ ~ │ │ └btn6 │ ├menu5 │ │ ├btn1 │ │ ~ ~ │ │ └btn6 │ └menu6 │ ├btn1 │ ~ ~ │ └btn6 └contents ☆★横スライド ├content1 ├content2 (☆中央へ) ├content3 ├content4 (★中央へ) ├content5 └content6 > 【btn2】から【contents】には、 > どのようなパスで命令を出したらいいのでしょうか? 【btn2】と書かれましてもどの【btn2】なのかわかりません。 この回答では【menu1】内にある【btn2】だということにしておきます。 相対パスの場合 これは「そのスクリプトを書く階層」によって変わります。 ActionScript 2.0 以下で onハンドラ を使ってボタンに書くのではないのですから ボタンの階層はどうでも良いと言えばどうでも良い事で スクリプトを書く階層がわからないと誰にもわかりません。 絶対パスなら フレームに書く場合だとどこにスクリプトを書いてもほぼ同じになります↓。 ※ただし 外部SWF をロードしない場合 ---例------------ ○○.btn2.addEventListener(MouseEvent.CLICK,setContentsX2); function setContentsX2(evt:MouseEvent):void { MovieClip(root).contents.x = 90; } ----------------- 上記 ○○.btn2… の ○○ は スクリプトを書く階層や都合によって当然変わります。 この ○○ は, this かもしれませんし menu1 かもしれませんし menus.menu1 かもしれませんし MovieClip(root).menus.menu1 かもしれませんし MovieClip(parent).menu1 かもしれませんし MovieClip(parent).menus.menu1 かもしれません。 (どれにするかは私が決めることではない) ちなみに私は動作確認検証のため スクリプトを root に書きました。 全文例↓ ----------------- var contents:MovieClip = new contentsMC(); contents.x = 10; contents.y = 10; addChild(contents); var menus:MovieClip = new menusMC(); menus.x = 10; menus.y = 70; addChild(menus); menus.menu1.btn2.addEventListener(MouseEvent.CLICK,setContentsX2); function setContentsX2(evt:MouseEvent):void { MovieClip(root).contents.x = 90; } -----------------
補足
ありがとうございます! すごく丁寧に図なども書いていただいて、助かりました。 絶対パスもわかりました。 もうひとつ、お伺いしたいのですがよろしいでしょうか? 【menu1】にscriptを書くとして、先日もお答えいただいた点を応用したいのですが。 たとえば、【btn4】を押したら【content4】に、【btn2】を押したら【content2】にTweenで移動したいのですが、なかなかうまくいきません。 【menu1】内のscript ----- var contents_x = MovieClip(root).contents.x; var con_x1:int = contents_x; var con_x2:int = contents_x - 500; var con_x3:int = contents_x - 1000; var con_x4:int = contents_x - 1500; var con_x5:int = contents_x - 2000; var con_x6:int = contents_x - 2500; for(var i:int = 1; i <= 7; i++){ this["btn" + i].addEventListener(MouseEvent.CLICK,conMV(i)); function conMV(num:int):Function { return function():void{ var conMV:Tween = new Tween(MovieClip(root).contents, "x", None.easeInOut, contents_x, "con_x" + num, 1, true); } } } ----- という風に書いていますが、うまくいきません。 考え方が間違っているのでしょうか?
お礼
本当になにからなにまでありがとうございます。 思うようなページになってきました。 もっともっと勉強しなくちゃいけないことばかりです。 これからもご指導よろしくお願いします。