• 締切済み

as3でTweenを複数インスタンスに同時で行う方法

as3でTweenを複数インスタンスに同時で行う方法 ロールオーバー時に、たくさんのインスタンスがウェーブするような動きを作ろうと思っています。 Tweenである領域に入ったインスタンスを上下に揺らすことが目的ですが、Tweenで同時にインスタンス10個ずつを順に&時間差で動かしたいです。 この場合、構文としてはどのようになるのでしょか?

みんなの回答

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

#2です > 決まった位置にこれ!というムービークリップは作れないと思います。 ??? スプライトが配置できてムービークリップが配置できない理由がよく(全く)わかりませんが。 ムービークリップの リンケージ で クラス名 として ○○ と付け new ○○() で ○○ クラスのムービークリップを呼び出して addchild で配置すれば良いだけだと思うのですが。 それではできないのでしたらスプライトでもできないと思います。 ちなみに スプライト + Tween の方法で出来るのでしたらそれで良いと思います。 全く異論はありません。

全文を見る
すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1 です。 > BlurFiltanさんの場合、このような動きはどのようなスクリプトにされますか? #1 を書いたのは良いのですが, ちょっと変更するだけでも #1 の内容を全て理解した上で さらにもっと工夫する必要が出てきます。 「そんな努力や試行錯誤をするくらいならスクリプトは使いません」 という意味で >私はこういう場合,TweenやTimerクラスを使用する方法は多分使いません。 と書いたんです。 ちょっとの変更ができるくらいなら これくらい楽勝で作れなければならないということですね。 基本的にスクリプトは使いません。 というか 使うのですが for文 と MovieClip.gotoAndPlay メソッドくらいです。 ムービークリップのタイムラインで 「●」 インスタンスがモーショントゥイーンで動くものを1つ作成します。 そのムービークリップに色々なインスタンス名を付けてステージ上に配置します。 それで, 再生開始させる場所(タイムライン(フレーム)) をインスタンスごとに変えれば良いだけでしょう? 何かに ロールオーバー した後 その何かから ロールアウト したときでも 「●」 を最初の位置に戻したければ gotoAndStop(1) をすれば良いだけです。 その後 再び同じ何かに ロールオーバー した時も 同じようにウェイブさせることもできれば, 続きからウェイブさせることもできます。 何を(どこを) 動きの出発地点にするかも モーショントゥイーン なら 楽々作成できます。 つまり 「もっと基本的なこと をすれば もっと柔軟に もっと楽に 何でもできます」 ということです。

superstarkei
質問者

お礼

なるほど、何でもスクリプトでしようとすると無駄に複雑になるだけってことですね。 仕様にもあるように、エリアごとに形も違うため、●の数も集合体の形も変わるので、どうしたらいいか迷っていました。 現在の処理は、エリアをかたどったインスタンスをhitTestPointで●を子インスタンスとして配置し、エリアのインスタンスをロールオーバーしたときに●が動く、というのをロジックにしています。 ただ、この●はSpriteで作っていて、スクリプトで動きを加えようとしてました。 この動きをタイムラインを使用して上下運動させるってことですね。 でも、●の数も集合体の形も変わることから、決まった位置にこれ!というムービークリップは作れないと思います。ウェーブの動きを加えるにはやはり先ほどのTweenの連鎖運動のスクリプトが必要になると思うのですが・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

メインタイムラインのステージ上に 10個のムービークリップ「mc0」~「mc9」と 1個のボタン「btn」を用意した場合(↓下図)の フレームに書くスクリプト例↓。 -------------------------- import fl.transitions.Tween; import fl.transitions.easing.*; import fl.transitions.TweenEvent; //「mc○」の個数を設定 var num:int = 10; //Tweenにかける秒数を設定 var sec:Number = 1; //Timer実行の遅延ミリ秒数を設定 var wait:int = 250; //「mc○」の初期 y座標 を保存 var base_y:Number = mc0.y; //「mc○」のスタート y座標 var start_y:Number = base_y; //「mc○」のゴール y座標 の設定 var finish_y:Number = base_y - 80; //カウント用変数の用意 var cnt:int; //Timerインスタンス「myTimer」を生成 var myTimer:Timer = new Timer(wait,num); //「myTimer」 に関数 timerHandler を実行する設定 myTimer.addEventListener(TimerEvent.TIMER, timerHandler); //関数 timerHandler の定義 function timerHandler(evt:TimerEvent):void { //Tweenインスタンスを生成 this["tween" + cnt] = new Tween(this["mc" + cnt],"y",Regular.easeInOut,start_y,finish_y,sec,true); //Tween終了時に 関数 myYoyo を実行する設定 this["tween" + cnt].addEventListener(TweenEvent.MOTION_FINISH,myYoyo); //カウント用変数に 1 を加算 cnt++; } //関数 myYoyo の定義 function myYoyo(evt:TweenEvent):void { //Tweenを逆再生 evt.currentTarget.yoyo(); } //「btn」マウスオーバー時に 関数 overHandler を実行する設定 btn.addEventListener(MouseEvent.MOUSE_OVER,overHandler); //関数 overHandler の定義 function overHandler(evt:MouseEvent):void { //最終Tweenが生成されていなければ if (this["tween" + (num-1)] == undefined) { //Timerスタート myTimer.start(); } for (var i:int=0; i<num; i++) { //Tweenが生成されていれば if (this["tween" + i] != undefined) { //Tweenを続きから再生 this["tween" + i].resume(); } } } //「btn」マウスアウト時に 関数 outHandler を実行する設定 btn.addEventListener(MouseEvent.MOUSE_OUT,outHandler); //関数 outHandler の定義 function outHandler(evt:MouseEvent):void { //最終Tweenが生成されていなければ if (this["tween" + (num-1)] == undefined) { //Timerストップ myTimer.stop(); } for (var i:int=0; i<num; i++) { //Tweenが生成されていれば if (this["tween" + i] != undefined) { //Tweenを停止 this["tween" + i].stop(); } } } -------------------------- 書いておきながら...何ですが, 私はこういう場合,TweenやTimerクラスを使用する方法は多分使いません。 字数制限のため以上。

superstarkei
質問者

お礼

ご親切にスクリプト書いていただき、ありがとうございます。 >書いておきながら...何ですが, >私はこういう場合,TweenやTimerクラスを使用する方法は多分使いません。 >字数制限のため以上。 BlurFiltanさんの場合、このような動きはどのようなスクリプトにされますか? 少し詳細を↓ 求人検索などでよくある「エリアからの検索」機能を作ろうと思っています。 マップ上をクリックすると、phpファイルにPOST送信し、SQLを発行&画面表示します。 マップは各地区ごとに「●」の集合体で描かれ、ロールオーバー時にその地区の●の集合体が動く、というのが仕様です。 ●の動きは何でもいいんですが、左から右へウェーブするような動きがいいと思っています。 なので、同じx座標にある複数(約10個くらい)が同時に動き、その最中に次のx座標が動く・・・のように、連鎖していきます。 簡単に、イメージ画像を載せます。 長々とすみませんが、アドバイスいただきたく、よろしくお願いいたします。

superstarkei
質問者

補足

すいません、画像が乗せれませんでした・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【flash】AS3のソースをすっきりさせたい(MCボタン)

    AS3を勉強しているのですが、何かもう少しソースをすっきりさせられないかと思っています。 MCの中に複数ボタン用のMCがあり、ロールオーバー・ロールアウト・クッリクの3パターン設定しています。よく本などで紹介されているように button1.addEventListener(MouseEvent.MOUSE_OVER,aover); button1.addEventListener(MouseEvent.MOUSE_OUT,aout); button1.addEventListener(MouseEvent.CLICK,aclick); function aover(evt){ button1.scaleX += 2;  ・  ・  ・ (続く) というような形で動かしています。MCのロールオーバー・ロールアウト時の動きは全て同じ値の拡大・縮小になるのですが、functionの中でbutton1.scaleX としているために、MCの数分functionを用意しないといけない状態です。 クリック時にはhttpから始まるリンク先にとばしている(ボタンごとにちがうアドレス)のですが、こちらも上と同様MC分のfunctionを用意しています。 これが20個も30個もあると動くは動くのですが、ものすごく長いソースになってしまいます。AS2の時はfunctionをどこかに用意しておいて、変数にインスタンス名を入れて(x = "button1"; のように)動かしていたのですが、今回それをやろうと思うと、インスタンス名を入れるfunctionを作らないといけなくてどちらにしても同じものを複数個つくらないといけないのかなぁ・・という気がしております。 動きに変更があった場合も全て変更しないといけなかったりでスマートでないなと感じています。 また、最初の button1.addEventListener(MouseEvent.MOUSE_OVER,aover); button1.addEventListener(MouseEvent.MOUSE_OUT,aout); button1.addEventListener(MouseEvent.CLICK,aclick); の部分は一つにまとめれたりしないでしょうか・・・(ここは無理でしょうか^^;) みなさん、このような場合どのように対処していますか?アドバイスよろしくお願いします。

    • ベストアンサー
    • Flash
  • 【急ぎ】setIntervalを使って各インスタンスごとに表示するタイミングを変える

    先ほどの書き込みと被ってしまいすみません。 現在、花火の「ナイアガラの滝」をFlashで表現しようとしています。 その際にトゥイーンではなくすべてASにて制御したいのです。 そして、時間差で画面の両端から真ん中に向かって花火がつくようにしたいと思っています。 現時点では、花火の火の粉を表すMCを作成してこのMCに対して以下のようなAS(指定位置から真下に落ちる)を記述しています。 ///////////////////////////////////////////////////// onClipEvent (enterFrame) { this._y = this._y+12; if (this._y>140) { this._y = 38.5; } } ////////////////////////////////////////////////////// このMCと同じ階層に上のMCを複製したものを数個配置しており、scriptレイヤーの1フレーム目には以下のようなASを記述しています。 ////////////////////////////////////////////////////// stop(); myID = setInterval(function () { gotoAndstop(2); clearInterval(myID); }, 3000); ////////////////////////////////////////////////////// はじめに説明した火の粉のMCは1つずつレイヤー分けして2フレーム目に配置しているので、上のASのままでは、全てが同時に再生されてしまい、花火のナイアガラっぽくありません。 より、リアルにする為に時間差で花火をつけたいです。 火の粉のMCにはa、b、c、dといった感じでインスタンス名をつけています。 1フレーム目に記述している「gotoAndstop(2);」をインスタンス名で指定すればいいのでは…と思い「gotoAndstop(a);」と、指定してみたのですが、何も表示されなくなってしまいます。 まだまだ、ASについて詳しくないので、分かり易く説明していただけると助かります。 急ぎなので、分かる方返信お願いします。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • CGIから複数の別プログラムを同時に呼び出す

    CGIから複数の別プログラムを同時に呼び出す Web上にある複数の画像を wgetで自サーバー内に取得してから、それにリンクした形のHTMLソースを吐き出すプログラムがあります。 ところが、複数の画像はループで順に取りに行っているものですから、全部取り込んでからHTMLを表示させるのに非常に時間がかかってしまいます。 そこで、wgetでファイルを取りに行くサブルーチン部分を独立させたプログラムを別に作り、接続先などのプロパティを渡した上、それぞれ同時に複数立ち上げて実行させようと思うのですが、可能なのでしょうか? system()関数だと一応別のプログラムを呼び出せるようですが、結局親プログラムは呼び出した一つの子プログラムの終了まで待って次に行くみたいなので意味ないかと・・・。 どなたかご教授頂ければ幸いです。

    • ベストアンサー
    • Perl
  • 「ボタンロールオーバー時のインスタンス同士の重なり」による動作について

    「ボタンロールオーバー時のインスタンス同士の重なり」による動作について flashcs4、as3で制作をしています。 配置してあるボタンインスタンスにマウスオーバーしたときに、 ボタンの上に吹き出しが表示されるというものをつくろうとしています。 現在記述しているスクリプトは まず、stageにhukidasiをaddChildして表示リストに追加。visibleをfalseにしておく。 btn1にマウスがロールオーバーしたときにhukidasiのvisibleをtrueにして表示。ロールアウトしたときはvisibleをfalseにして非表示にする。 というものです。 こちらの反応はいちおう実現できたのですが、ロールオーバー時にボタン(btn1)と吹き出し(hukidasi)が重なっている部分にマウスをもっていくと、吹き出しが点滅して消えたり表示されたりを繰り返してしまうのです。 サンプル http://homepage2.nifty.com/meary/testtest.html それを解消させるために、吹き出し(hukidasi)はボタン(btn1)の子としてaddChildして、 btn1.mouseChildren=falseとして吹き出しにボタンの機能を持たせないようにしてみると前述のような反応はなくなりました。 ですが、このように吹き出しをボタンの子とすると、ボタンの領域に吹き出しの大きさも追加されてしまいまして、そのようなことは望んでいないのです。 ボタンの領域をマウスが外れたら吹き出しが消える、というようにしたいのです。 このようなことを実現するにはどういったスクリプトが必要でしょうか。 ご教授お願いいたします。 現在記述しているスクリプト -------------------------------------------- //吹き出しインスタンスを生成 var hukidasi:Hukidasi=new Hukidasi(); hukidasi.x=90; hukidasi.y=80; //吹き出しを表示リストに追加 stage.addChild(hukidasi); hukidasi.visible=false; btn1.addEventListener(MouseEvent.ROLL_OVER,btn1_handleRollOver); btn1.addEventListener(MouseEvent.ROLL_OUT,btn1_handleRollOut); //btn1のロールオーバー、アウト時のメソッド function btn1_handleRollOver(event:MouseEvent){ hukidasi.visible=true; } function btn1_handleRollOut(event:MouseEvent){ hukidasi.visible=false; } --------------------------------------------

    • ベストアンサー
    • Flash
  • 子インスタンスを登録するメソッドの作成

    Java初心者です。 学習中に躓いてしまったので、ご教示いただければと思います。 Testという1つのクラスを作成し、 そこから複数のインスタンスを作成します。 Test test1 = new Test(); Test test2 = new Test(); Test test3 = new Test(); 元のTestクラスの中に、 public void addSub(Test child) という、引数に指定したインスタンスを子に登録するメソッドを用意します。 実際に使うときは、 test1.addSub(test2); とすれば、test1の子にtest2が登録されるようにしたいのです。 基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。 このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。 質問の方法が曖昧で分かりにくいと思いますが、 指示いただければ追記いたしますので、 お時間のある方お力を貸していただければと思います。 宜しくお願いします。

    • ベストアンサー
    • Java
  • for文を使ったボタン

    for文を使ったボタン ボタンが2つあり、そのボタンをロールオーバー、ロールアウトでそれぞれ違うmcを動かしたいのですが、うまくいきません。ボタンを「maru1、maru2」として動かしたいmcを「btn1、btn2」とインスタンス名をつけて以下のスクリプトを書きました。 maru1.addEventListener(MouseEvent.ROLL_OVER,onMouse1); maru1.addEventListener(MouseEvent.ROLL_OUT,outMouse1); maru1.buttonMode = true; maru2.addEventListener(MouseEvent.ROLL_OVER,onMouse2); maru2.addEventListener(MouseEvent.ROLL_OUT,outMouse2); maru2.buttonMode = true; function onMouse1(e:MouseEvent):void{ mc_tween = new Tween(btn1, "scaleX", Elastic.easeOut, 0.7, 1, 1, true); mc_tween.start(); } function outMouse1(e:MouseEvent):void{ mc_tween = new Tween(btn1, "scaleX", Elastic.easeOut, 1, 0.7, 1, true); mc_tween.start(); } function onMouse2(e:MouseEvent):void{ mc_tween = new Tween(btn2, "scaleX", Elastic.easeOut, 0.7, 1, 1, true); mc_tween.start(); } function outMouse2(e:MouseEvent):void{ mc_tween = new Tween(btn2, "scaleX", Elastic.easeOut, 1, 0.7, 1, true); mc_tween.start(); } これでも動くのですが、ボタンが沢山あった場合にfor文を使ってできないかと考え、ttp://www.oro.co.jp/web/creator/flash/actionscript/soft-button.htmlを参考に var mc_tween:Tween; //イベント登録 for(var i:int = 1; i < 3; i++){ this["maru"+i].addEventListener(MouseEvent.ROLL_OVER, rollOverEvent); this["maru"+i].addEventListener(MouseEvent.ROLL_OUT, rollOutEvent); this["maru"+i].buttonMode = true; } function rollOverEvent(event:Event):void{ var btn:MovieClip = event.target as MovieClip; mc_tween = new Tween(btn, "scaleX", Elastic.easeOut, btn.scaleX, 1.5, 1, true); mc_tween = new Tween(btn, "scaleY", Elastic.easeOut, btn.scaleY, 1.5, 1, true); addChildAt(btn, 5); } function rollOutEvent(event:Event):void{ var btn:MovieClip = event.target as MovieClip; mc_tween = new Tween(btn, "scaleX", Elastic.easeOut, btn.scaleX, 1, 1, true); mc_tween = new Tween(btn, "scaleY", Elastic.easeOut, btn.scaleY, 1, 1, true); } と書いたのですが、上手く行きません。<var btn:MovieClip = event.target as MovieClip;>の部分でどのように「btn1、btn2」を参照したらいいのでしょうか。 作業環境はmacOSX flashCS5 actionscript3です。よろしくお願い致します。

    • ベストアンサー
    • Flash
  • マウスでHPをスクロール

    マウスの中央にあるローラーのようなボタンを上下して、HPをスクロールしているのですが、その動きが不自然で改善したいです。 どのように不自然かというと、ローラーを上下にやると画面が上下するのですが、その動きが遅れて上下します。ローラーを動かすと同時にHPなどの画面も動かしたいのですが・・・。 どうしても時間差が発生してしまいます。 このような症状の改善方法を知っている方、教えて頂けないでしょうか? ちなみに、この手の質問を以前投稿し、解決策として、新品のマウスを購入しました。 新品のマウスでも改善されないので、再度投稿しました。

  • RT-200NE 複数のプロバイダを同時に利用する方法について

    RT-200NE 複数のプロバイダを同時に利用する方法について 質問失礼します。 現在複数のプロバイダと契約しており、サーバ用とその他用で回線を同時に使いたいと考えております。 現在のルータでそのような設定は可能でしょうか? または別のルータを購入すれば実現できそうでしょうか。 現在の具体的な環境は ・サーバマシン1台(windowsXP機またはLinux機、気分で変えてます) ・その他機器(メインPC(win7)、XBOX360等ゲーム機) ・ルータ(RT-200NE) サーバマシンで稼働させているサービスは ・Webサーバ ・ボイスチャットや簡易ゲームサーバ(お絵かきチャット等の簡素なもの) の2点がメインです。 契約回線はBフレッツの確かハイパーファイミリー(マンションタイプではない) プロバイダは@niftyとMOUの2プロバイダです。 求める状態は ・サーバ機器はMOUと接続 ・その他機器は@niftyと接続 ・特に手動の切り替え操作を必要としない このような環境(複数プロバイダ契約)に至った経緯は、 @niftyの回線でサーバを立てていると特定の時間(主にGT)にボイスチャットサーバが総切断を食らう(クライアントが次々と落ちていきます)ため、予備の回線を用意したかった。 ところが新しく契約したプロバイダはサーバマシンとの切断こそないものの、GTになるとメインPCでゲームがマトモにできなくなるほど遅延がひどくなる(niftyではそういうことはない)ため、それぞれを目的に応じて違う回線で同時に利用したいというカンジです。 ですので、どちらかのプロバイダ1本にしぼり状況が解決するようであれば、それが一番お財布的には最高の解決方法なのですが、すでに2本契約している状態なのでこの環境でなんとか解決してみたいなという思いです。 普段であればのんびり実験しつつ自力で解決を目指したいところなのですが、至極個人的な事情でのんびり実験している暇がなく、ある程度は調べたものの凡ミスで今のサービスを停止してもよい状態でもないので、経験者の方の模範解答を参考に先に状況だけ解決したい状況です。 あとよろしければネットワークやサーバ初心者が暇になったとき読んでおいたほうがよさそうな文献等紹介していただけると幸いです。 どうぞよろしくお願いします。

  • エクセルVBA(rangeでの複数範囲指定方法)

    いつも有難うございます。 タイトルの件でご教示いただきたく、お願いいたします。 やりたいことは、複数のセル結合を一括でおこないたい、というものです。 具体的には【A列をn行目まで、2行ずつセル結合する】方法です。 例えば、20行目まで2行ずつ結合する、と決まっていれば次のような記述が可能です。 (例1) Range( _ "A1:A2,A3:A4,A5:A6,A7:A8,A9:A10,A11:A12,A13:A14,A15:A16,A17:A18,A19:A20"). _ MergeCells = True これを「n行目」までとするため、次のような記述を考えました。 (例2)   Dim i As Integer   Dim n As Integer Range("A65536").End(xlUp).Select n = ActiveCell.Row + 1 For i = 1 To n Step 2 Range(Cells(i, 1), Cells(i + 1, 1)).MergeCells = True Next こちらの For ~ Next 内の構文についてです。 この構文ですと、一つずつ選択→結合をしていくので、相応の時間がかかってしまうため、 例1の構文のように、先に範囲を指定して一括で結合する方法を調べたのですが見つからず 質問させていただきました。 (やりたい構文) For i = 1 To n Step 2   ※ = (A1:A2,A3:A4,・・・An-1:An) Next   Range(※).MergeCells = True このような方法はありますでしょうか。 ご教示のほど、宜しくお願いいたします。

  • 小魚の群れの瞬間転回

    何故、魚の群れは同時に同じ動きができるのでしょうか?リーダーの動きに合わせてるのでしょうか?。 真似してるのであれば時間差があるはずだとおもえるし、なかにはとろいのがいてもよさそうなのに見事に同一行動をとります。テレパシーとしか考えられません。