• 締切済み

階層をまたぐ命令について

Flash CS4 as2.0です。 メインタイムラインの下にムービークリップmc1、flash1、flash2をつくり、mc1の下にさらに ムービークリップmc2を作りまして、メインタイムラインには、var hensu=0;という変数を設定しています。この場合のmc2に書いたスクリプトの動作についてですが、 on(release){ _root.flash1.gotoAndStop("aa"); ・・・(1) _root.flash2.gotoAndStop("bb"); ・・・(2) _root.hensu=1; ・・・(3)        } 上記の(1)と(2)は実行されますが、(3)については実行されません。 記述を(3)、(1)、(2)と変えても同じです。 孫階層から2代上の親階層(メインタイムライン)へのアクセスはできないのでしょうか。

  • irako
  • お礼率93% (29/31)

みんなの回答

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

> これから3.0ができないと困りますか。 それは人によるとは思いますが 現実的にすでに困ってませんか? 私は CS4 では ActionScript 2.0 は書けないというかすごく書きにくいのでまず書きません。 ヘルプなどもまともに動きませんし。。。 ActionScript 2.0 を書くときは 今でも Flash 8 を使います。 それに CS4 で ActionScript 2.0 設定のドキュメントを作成して ステージ上にムービークリップを作成し 「3D回転ツール」でグリグリ回転させようとすると 「3D 変換は ActionScript 2.0 ではサポートされていません!」 などどいう警告が出ます。 また ActionScript 2.0 では 3D 位置も使えません。 要するに ActionScript 3.0 のコード(スクリプト)自体は全く使わずに 単なるモーショントゥイーンをさせるだけでも ActionScript 3.0 にする必要が出てくる場合もあります。 その状態でもしボタンを置く必要性が出てきたら... 単なるフレーム移動だけだも ActionScript 3.0 で書かざるを得ませんよね。 と言う感じで 私は2.0でも充分ではないかと思う箇所も 結局は ActionScript 3.0 にせざるを得ない状況になることが多くなると思ったので ActionScript 3.0 をコツコツとやっています。 それに 外部ライブラリ(クラス)やサンプルなども ActionScript 3.0 が大半になってきたでしょう。 ActionScript 2.0 でできることでもすごくやりにくいですよ。

irako
質問者

お礼

回答ありがとうございます。 今のところはそれほど高度なものを作成していないので、2.0で困ったと感じることは ほとんどありませんでした。 3.0は「Flash独習」とかいう本を持っていまして、ほんのさわりくらいは読みました。 2.0までの記述方法に慣れていると、3.0はなんだかとても面倒に感じてしまいまして ゲーム制作には2.0を使っています。2.0ってそのうちなくなってしまうのかな。 少しずつ3.0を使えるように勉強はしたいと思ってます。 またいつか質問することもあるかと思いますがよろしくお願いします。

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

単純に考えて, > ムービークリップmc1、flash1、flash2をつくり、 と書かれていらっしゃる 「flash1、flash2を」 は, 本件(ご質問本題)と全く関係がないと推測されます。 また, _root.flash1.gotoAndStop("aa"); ・・・(1) _root.flash2.gotoAndStop("bb"); ・・・(2) この2行も本件(ご質問本題)と全く関係がないと推測されます。 まずは問題点を切り分けて単純化しましょう。 ・番外編 - 質問NGワード集 - テクニカルノート より「問題を切分けない」 http://www.fumiononaka.com/TechNotes/NGWords.html#Mo 例えば 上記のスクリプト (1)(2)を書いたから動作がおかしくなるのでしょうか? そうであれば (1)(2)に原因があるはずです。 もし(1)(2)を書いても書かなくても 同じように _root.hensu=1; ・・・(3) ができないのであれば (1)(2)は問題外なのですから 自身で原因を探る際も,質問をする際も除外すべきです。 =============== 以上のような当然の大前提に立った上で, (1)(2)は問題外であったと仮定します。 その場合 _root.hensu=1; ・・・(3) ができないことをどのようにして確かめられたのでしょうか? 確かめ方に大きな原因(ミス)があると思います。 たとえばmc2自体に on(release){ _root.hensu=1; trace(_root.hensu); } と書いて 「制御」→「ムービープレビュー」で検証されたのでしょうか? もし上のようにして検証してみて 問題が無いようでしたら(1が出力されるようでしたら), 元々の検証方法や動作のしくみに原因があるということになります。

irako
質問者

お礼

BlurFiltan様 回答ありがとうございます。 _root.hensu=1;の確認は、mc1内の別のボタンのスクリプトに on(release){ if(_root.hensu==1){ (処理内容) } として、この処理内容が実行されなかったことで確認しました。 試しにmc2に on(release){ _root.hensu=1; } だけを記述して((1)と(2)を書かないで)mc1内のボタンに on(release){ if(_root.hensu==1){ trace(_root.hensu); } としてみたところ、トレースはできました。ということは、(1)と(2)に問題があると思うのです。 以前にも、階層をまたぐ記述で動作しないことがありました。 例えば、メインタイムラインのあるフレームラベルを"cs4"として、メインに置いたムービークリップに on(release){ _root.gotoAndStop("cs4"); (複数の処理内容) } としたところ、gotoAndStop("cs4")だけが実行されて処理内容が無視されました。このときは on(release){ (複数の処理内容) _root.gotoAndStop("cs4"); } とすることで事なきを得ました。今回は(3)(1)(2)のように記述を入れ替えても(1)(2)は 動作しますが(3)は動作しなくなります。

irako
質問者

補足

あれから分岐の記述をいろいろと変えてみたりしたところ、何とか問題解決しました。 ありがとうございました。 今はFlashで簡単なゲームを作っていてas2.0なのですが、やはりas3.0に移行していくほうが よいのでしょうか。 3.0は複数の人数でFlash制作をする場合に都合がよいもので、自分一人の制作なら2.0でも充分ではないかと 勝手に思っているのですが、これから3.0ができないと困りますか。

関連するQ&A

  • setTimeoutでの制御に関しまして

    初めて質問をさせて頂きます。よろしくお願い致します。 「mc_Image1」、「mc_Image2」、「mc_Image3」という 各ムービークリップをストップボタンを押した際に時間差で停止させたいのですが 「mc_Image2」、「mc_Image3」がstopがかからない状態が稀に生じたりします。 (ムービークリップは全て、1フレーム目にstop();、10フレーム目にgotoAndPlay(2);と設定) 少し端折っておりますが、スクリプトを記載いたします。 ---------------------------- //何回ルーレットしたかカウントする var count:Number = 0; //スタート/ストップボタンが押された押されていないかのフラグ var flg_StartStop:Boolean = false; // mc_Image停止待機速度変数(ミリ秒) var hensu1 = 2000; var hensu2 = 3000; //スタート/ストップボタンを押した時に呼び出される関数 btn_StartStop.onPress = function() { if(flg_StartStop) { //選ばれたフレームに飛ぶ mc_Image1.gotoAndStop(parseInt(one)+1); // setInterval で hensu(ミリ秒)後に_root.gotoAndStop(); を実行 stopID = setInterval(function () { _root.mc_Image2.gotoAndStop(parseInt(two)+1); clearInterval(stopID); }, hensu); stop2ID = setInterval(function () { _root.mc_Image3.gotoAndStop(parseInt(three)+1); clearInterval(stop2ID); }, hensu2); //押されたかどうかの変数を「偽」に flg_StartStop = false; //カウンタを増やす count++; } else { //ムービークリップを走らせる mc_Image1.play(); mc_Image2.play(); mc_Image3.play(); //押されたかどうかの変数を「真」に flg_StartStop = true; } } ---------------------------- 。 きちんと「gotoAndStop();」させるにはどのように対処すれば よろしいでしょうか。 不足がございましたら申し訳ありません。 何卒よろしくお願い致します。

  • メインのタイムラインに戻るボタン

    同じような質問を幾つかあたってみたのですが上手くいかなかったので質問させていただきます。 FLASH8でFLASHを作成しています。 メインになるタイムライン上にムービークリップでウィンドウを作りました。 更にその中(ドラッグした時に一緒に動かす為、入れ子にしている)に、ウィンドウを閉じる為のボタンを作りました。 ウィンドウを閉じた状態にする為には、メインのタイムラインにある "main"というフレーム名の場所に戻らなければならないのですが、ボタンが反応せずウィンドウを閉じる事が出来ません。 現在ボタンには on (release) { _root.gotoAndStop("main"); } このアクションスクリプトを記述しています。

    • ベストアンサー
    • Flash
  • addchildからrootに命令

    flash cs3、actionscript3.0で制作しています。 メインのタイムラインに var tra:trailer = new trailer(); stage.addChild(tra); と書いてライブラリー内にあるクラス名trailerのムービークリップを生成しています。 この生成されたtrailerの中にボタンがあってそこからrootに置いてあるムービークリップに命令を出したいのですが、actionscript2.0だったら_rootや_level0を使って書けたんですがactionscript3.0だとパスがわかりません。 どなたか分かる方いませんか?

    • ベストアンサー
    • Flash
  • ムービークリップのボタン化

    menu01_mcというムービークリップをボタンにしたいのですが、 ボタン自体に on (release) { _root.photo_mc.loadMovie("1.jpg"); } と書くと正常に動くのですが、 タイムライン上に menu01_mc.onRelease = function(){ _root.photo_mc.loadMovie("1.jpg"); } と書くと動きません。 どのようにすればいいのでしょうか? わかる方教えてください。よろしくお願いします。

  • AS3:ルートの変数とムービークリップ内の変数について

    AS3:ルートの変数とムービークリップ内の変数について ルートのタイムラインで設定した変数var RootVarがあるとして、これをあるムービークリップMCからMovieClip(root).RootVarで読み取って、MC内で何か処理をしたときMovieClip(root).RootVar++;とやってもルートのRootVarの値は変わりません。 例えば、 ■ルートのタイムライン1フレームに記述 var RootVar:uint; if(RootVar>=3){ trace("できた!!"); } ■ステージにあるムービークリップMCのタイムライン1フレームに記述 MovieClip(root).RootVar=0; var AddTimer:Timer = new Timer(1000,3); AddTimer.addEventListener(TimerEvent.TIMER,AddNum); AddTimer.start(); function AddNum(eventObject:TimerEvent):void { MovieClip(root).RootVar++; } ルートからムービークリップ、ムービークリップからルートへ変数に値を渡したり受け取ったりはできなのでしょうか? 変数の扱い方が問題なのでしょうか?よろしくお願いします。 環境:AS3、Flash CS4

    • ベストアンサー
    • Flash
  • 配列演算子を使って変数を使いたい

    いつも、ありがとうございます。MAC OSX Flash8です。 ランダムで作った変数でムービークリップのタイムラインを使って複数のmcを複数の位置にランダムに配置しようとしています。 この時に、変数を使って階層の中のmcのインスタンス名にgo toを渡したいのですがうまくいきません。配列演算子の使い方がまだよくわかっていないためだと思います。スクリプトは以下のようです。 _root.shuffle.gotoAndStop(sfl[tim]) if (tim == 1) { _root.shuffle.shuffle+sfl[1].shiro+ichi[1].gotoAndStop(1) _root.shuffle.shuffle+sfl[1].shiro+ichi[2].gotoAndStop(nise[1]) _root.shuffle.shuffle+sfl[1].shiro+ichi[3].gotoAndStop(nise[2]) } 3種類のランダムで作った変数は、sfl[1] ichi[1] nise[1] です。 nise[1]はこのままで使えるようでした。たとえばshuffle1の1にsfl[1]をshiro1の1にichi[1]をあててランダムでできている数字を入れたいのですがどうしたらいいのでしょうか? よろしく、お願いします。

    • ベストアンサー
    • Flash
  • ムービークリップがマウスカーソルを追いかけ、マウスカーソルと同じ位置に来たときにムービークリップを変えたい

    以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム2に移動しません。 ドラゴンクエストVIIIのトップページのFlashのような 表現をしたいのですがうまくいきません。 http://www.square-enix.co.jp/dragonquest/eight/ _mc.onEnterFrame = function() { this._x += ( _root._xmouse - this._x ) / 5; if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); else this._mc.gotoAndStop(1); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

    • ベストアンサー
    • Flash
  • 子ムービークリップの制御について

    flash初心者です。子ムービークリップの制御について教えてください Tシャツのシュミレーションがあるとします。 シャツ_mcに、1フレーム目「丸くび」、2フレーム目「Vネック」、のカタチで シャツ_mc.色_mcにマスクをかけています。 色_mcには1フレーム目「白」、2フレーム目に「赤」とします。 シャツ_mc.色_mcのそれぞれ1フレームにstop(); ボタン「丸くび_btn」「Vネック_btn」「白_btn」「赤_btn」の4つのボタンで それぞれ組み合わせを作りたいのですが 「丸くび_btn」に on (release) { _root.シャツ_mc.gotoAndStop(1); } 「Vネック_btn」に on (release) { _root.シャツ_mc.gotoAndStop(2); } 「白_btn」に on (release) { _root.シャツ_mc.色_mc.gotoAndStop(1); } 「赤_btn」に on (release) { _root.シャツ_mc.色_mc.gotoAndStop(2); } この場合「丸くび_btn」をクリックして「赤_btn」クリックで「丸くび赤シャツ」ができます ここまではいいのですが 赤の色を保持したまま「Vネック_btn」を押してVネック赤シャツのイメージも見たいのですが 色が白に戻戻ってしまいます。(色_mcの1フレーム目に戻る。) これをなんとかしたいのですが。 (色_mcが選ばれた状態で固定され勝手に移動しないようにしたい) アドバイスお願いいたします。

  • ActionScript3.0フレーム移動について

    お世話になります。 Flash ActionScript3.0で、ボタンをクリックしたら、 階層違いのシーンに移動するという 単純なところでつまずいています。 一番上の階層には、 1フレーム目 フレームラベル "a" 2フレーム目 フレームラベル "b" として、それぞれ this.stop();を書いてあります。 "a""b"には、それぞれムービークリップが配置してあって、 今やりたいことは、"a"に配置してあるムービークリップの 2つ下(中?)の階層にあるボタンをクリックしたら、一番上の階層の"b"に移動して、 "b"に配置してあるムービークリップを表示するようにしたいのです。 "a"のムービークリップのボタンのあるフレームには、 this.stop(); button01.addEventListener(MouseEvent.CLICK,jumpB); function jumpB(event:MouseEvent):void { MovieClip(parent.parent).gotoAndStop("b"); } と書いてみましたが、 [TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。] と怒られます。 試しに MovieClip(stage).gotoAndStop("b"); とか、"b"に配置してあるムービークリップにインスタンス名"b_mc"を与えて MovieClip(parent.parent).b_mc.play(); などと苦し紛れにやってみましたが、すべて同じように怒られます。 どのようにすれば、下の階層から一番上の階層の別フレームに 移動することができますでしょうか? よろしくお願い致します。

  • _alphaで消えません。。。。

    質問です。(FLASH8です) メインのタイムラインのムービークリップword_mcの中にactionscript、this.loadVariables("food1.txt");で 同じタイムラインのダイナミックテキストに呼び出しています。 メインのタイムラインにあるムービークリップword_mcに onClipEvent(enterFrame){ this._aplha=0; } と記述したのですが中の文字が消えません。 どなたかよろしければ教えてください。

    • ベストアンサー
    • Flash