ActionScriptでフェードインから反転のアニメーションを作る方法

このQ&Aのポイント
  • ActionScriptを使用してランダムな画像がフェードインし、一定の時間経過後に反転するアニメーションを作りたいです。
  • 反転すると別のランダムな画像が読み込まれ、また一定の時間経過後に再び反転すると新しいランダムな画像が読み込まれるという変わったアニメーションです。
  • Flash 8とActionScript 2.0の環境で作業を行っています。現在はフェードインと一度の反転まで実装済みで、反転後の処理をどう組めば良いのかわかりません。どなたか教えていただけないでしょうか。
回答を見る
  • ベストアンサー

フェードインから反転のアニメーション:actionscript

ActionScriptでランダムに画像を読み込んだ状態でランダムフェードインして、ランダム秒数後に反転する。 反転すると違う画像がランダムに読み込まれていて、そしてまたランダム秒数後にまた反転してひっくり返るとまたランダムに画像が読み込まれているという、変わったアニメーションを作りたいのですが。(下の図を参照してください。) 現在ここまで↓できていて、xscaleを使えばできそうな感じなのですが、どうスクリプトを組めばよいかわかりません、どなたか教えてください。 環境;Flash 8,ActionScript2.0 ------------------------------------------------------------------- 回転させるparent_mcの1フレームに記述: // フェードイン設定 var load_time:Number = getTimer(); var wait_time:Number = Math.random()*1000; this._alpha = 0; // 反転タイマー関数 function InversionTimer() { flg++; } // ランダム秒設定 var max_sec:Number = 9; var min_sec:Number = 4; var random_sec:Number = Math.floor(Math.random()*(max_sec-min_sec+1))+min_sec; // フラグ変数 var flg:Number = 0; // MCのスケール関係 var scale:Number = 100; var scale_spd:Number = 8; this.onEnterFrame = function() { if (load_time+wait_time<getTimer()&&flg==0) { this._alpha += 2; if (this._alpha>99) { this._alpha = 100; flg = 1; setTimeout(InversionTimer, random_sec*1000); } } if (flg==2) { this.loader._xscale = scale; scale -= scale_spd; if (scale<=0) { scale = 0; this.child_mc.unloadMovie(IMG); flg = 3; } } else if (flg==3) { ???????????? } };

  • Flash
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

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

onEnterFrame=function(){}; は onClipEvent(enterFrame){} と違って, 途中で削除したり,違う function に切り替えたりすることができます。 フラグを変えてif文で分岐させて動作を切り替えて行く方法もできなくはありませんが, 複雑になって頭がこんがらがるので, onEnterFrame で実行させる関数を切り替えて行く方法はいかがでしょうか。 SWF や HTML と同じフォルダに 「0.jpg」「1.jpg」「2.jpg」「3.jpg」「4.jpg」 という外部JPEGがあるとします。 ムービーの階層構造が次のようになっているものとして,  _root   └parent_mc     └child_mc 「parent_mc」のフレーム1に書くスクリプト例です。 ------------------------------------------------------- // ---ランダム秒設定--- var max_sec:Number = 9; var min_sec:Number = 4; var random_sec:Number = Math.floor(Math.random()*(max_sec-min_sec+1))+min_sec; // ---MCのスケール関係--- var scale_spd:Number = 8; // ---初期状態の設定--- // このMCのアルファを 0 にしておく _alpha = 0; // 0~4.jpg から ランダムな JPEG を child_mc にロード child_mc.loadMovie(Math.floor(Math.random()*5)+".jpg"); // 「フェードインする関数」を1フレーム進む時間毎に随時実行 onEnterFrame = fadeIn; //---フェードインする関数を定義--- function fadeIn():Void { // このMCのアルファを2ずつ加算 this._alpha += 2; if (this._alpha>99) { this._alpha = 100; // ランダム秒後に「待って実行する関数」を実行 setTimeout(InversionTimer, random_sec*1000); // このMCの onEnterFrame を削除 delete onEnterFrame; } } // ---待って実行する関数を定義--- function InversionTimer():Void { // 「縮小する関数」を1フレーム進む時間毎に随時実行 onEnterFrame = scaleDown; } // ---縮小する関数を定義--- function scaleDown():Void { // このMC横スケールを縮小 _xscale -= scale_spd; // もしこのMCの横スケールが0以下になれば if (_xscale<=0) { // このMCの横スケールを0にする _xscale = 0; // 0~4.jpg から ランダムな JPEG を child_mc にロード child_mc.loadMovie(Math.floor(Math.random()*5)+".jpg"); // 「拡大する関数」を1フレーム進む時間毎に随時実行 onEnterFrame = scaleUp; } } // ---拡大する関数を定義--- function scaleUp():Void { // このMC横スケールを拡大 _xscale += scale_spd; // もしこのMCの横スケールが100以上になれば if (_xscale>=100) { // このMCの横スケールを100にする _xscale = 100; // ランダム秒後に「待って実行する関数」を実行 setTimeout(InversionTimer, random_sec*1000); // このMCの onEnterFrame を削除 delete onEnterFrame; } } ------------------------------------------------------- この場合は最後で InversionTimer に戻りますが, 同じ調子でどんどん関数で動作を足していくこともできますね。 onClipEvent(enterFrame){} の場合はどうしても スクリプトを中に中に入れ込んでコーディングしていかなければならない状態になりますが, onEnterFrame の方は 上のようにスクリプトを次へ次へ足して行くこともできるので柔軟に色々なことができます。

yoyoyoiyoi
質問者

お礼

お返事遅くなりました、functionの切り替えのやり方に変えましたら、 すんなりできました。 なるほどonEnterFrameってフラグ変数作らなくても行動の切り替えできるんですね。関数の入れ子でやるとわりと簡単にできてしまうなんて、これを教えてくれなければおそらくあきらめていたかもしれません。 ちなみに、 // 0~4.jpg から ランダムな JPEG を child_mc にロード child_mc.loadMovie(Math.floor(Math.random()*5)+".jpg"); の部分は var max_photo:Number = 5; // 使う写真の最大枚数 var rand:Array = new Array(max_photo); for(i=0; i<max_poto; i++) { rand[i] = i; } var j:NUmber = rand.lenght; while (j--) { var j = Math.floor(Math.random()*(j+1)); var swap = rand[j]; rand[j] = rand[k]; rand[k] = swap; } child_mc.loadMovie(rand[k] +".jpg"); てやると、毎回ランダムに違う画像読んでくれて完璧ですね。 ご丁寧に教えていただきありがとうございました。

関連するQ&A

  • 画像をフェードインアウトさせたいのですが・・・

    勉強しながら四苦八苦しております。 今現在 背景を5つある画像の中からランダムに表示→数十秒ごとにその5つの画像からランダムに切り替え というものをなんとか完成させました。 それでこのランダムに切り替えるときに画像をフェードさせたいのですがどうも上手くいきません。。 // 画像を読み込む  num =Math.floor(Math.random() * 5); loadMovie(num + ".jpg", "img"); //何秒ごとに画像を切り替えるか setInterval(move,20000); //切り替える画像をランダムに表示 function move():Void { aaa =Math.floor(Math.random() * 4); loadMovie(aaa + ".jpg", "img"); } //以下を加えるとエラーになってしまいます。 onClipEvent(load) { flg = -1; myspd = 5; } onClipEvent(enterFrame) { tmp = this._alpha+(myspd*flg); if (tmp>100 { tmp = 100; flg = -1; } else if (tmp<0) { tmp = 0; flg = 1; } this._alpha = tmp; } どなたか分かるようでございましたらご教示下さい。。。 ヒントだけでもけっこうですので。

    • ベストアンサー
    • Flash
  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • Flash
  • ActionScript3.0の質問です

    このようなプログラムも考えました。 デバッグではエラーは出ませんでしたが、論理的、プログラム的に問題はありますでしょうか? function fl_GenerateRandomNumber(limit:Number):Number { var randomNumber:Number = Math.floor(Math.random()*(limit+1)); return randomNumber; } var xxx:Number=fl_GenerateRandomNumber(3); Button_1.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrameButton); function fl_ClickToGoToAndStopAtFrameButton(event:MouseEvent):void { if(xxx==0) {this.gotoAndStop(3);} else {this.gotoAndStop(7);} } function fl_GenerateRandomNumber2(limit:Number):Number { var randomNumber:Number = Math.floor(Math.random()*(limit+1)); return randomNumber; } var xxx2:Number=fl_GenerateRandomNumber2(3); Button_2.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame2Button); function fl_ClickToGoToAndStopAtFrame2Button(event:MouseEvent):void { if(xxx2==1) {this.gotoAndStop(4);} else {this.gotoAndStop(7);} }

    • ベストアンサー
    • Flash
  • AS3.0のカスタムクラスを使いたいのですが

    Flash AS3.0を使って出席を確認するプログラムを作っているのですが、カスタムクラスを利用して動作させようとすると思った通りに動作しません。 下のプログラムをカスタムクラスを使って動作させるにはどうすればいいのか教えてもらえないでしょうか、よろしくお願いします。 ________________________________________________________________________________________________________ import flash.geom.*; import flash.utils.*; import flash.events.*; import flash.display.*; var starttime:Number; var stoptime:Number; var reset:Number; var flag:int; var sec; var min; var hou; var h; var m; Clock.addEventListener(Event.ENTER_FRAME,getdate); time1.addEventListener(Event.ENTER_FRAME,count); mc1.addEventListener(Event.ENTER_FRAME,changecolor); btn1.addEventListener(MouseEvent.CLICK, ST); function getdate(e:Event):void{ //時間情報の取得 var time :Date = new Date(); var year = time.getFullYear(); var mon = time.getMonth()+1; var day = time.getDate(); h = time.getHours(); m = time.getMinutes(); //時計の桁あわせ h = ((h < 10) ? "0" : "") + h; m = ((m < 10) ? "0" : "") + m; //テキストに書き込む Clock.text =""+year+"/"+mon+"/"+day+" "+h+":"+m; } function count(e:Event):void{ if(flag==1){ var mil = getTimer() - reset; sec = Math.floor(mil/1000); min = Math.floor(sec/60); hou = Math.floor(min/60); // 次の単位を超えないように制限 mil %= 1000; sec %= 60; min %= 60; //時間の桁をあわせる min = ((min < 10) ? "0" : "") + min; hou = ((hou < 10) ? "0" : "") + hou; // すべてつなげて文字として表示 timer1.text ="経過時間 "+hou + " : " + min; }else{ timer1.text ="経過時間 00 : 00"; } } function changecolor(e:Event){ var trans:Transform = new Transform(mc1); var colorTrans:ColorTransform = new ColorTransform( 1, 1, 1, 1, 0, 0, 0, 0); if(flag==1){ if(sec <20){ colorTrans.redOffset = 0; colorTrans.greenOffset = 0; colorTrans.blueOffset = 255; } if(sec >=20 && sec <40){ colorTrans.redOffset = 0; colorTrans.greenOffset = 255; colorTrans.blueOffset = 0; } if(sec>=40 && sec<60){ colorTrans.redOffset = 255; colorTrans.greenOffset = 0; colorTrans.blueOffset = 0; } } trans.colorTransform = colorTrans; } function ST(event:MouseEvent):int{ if(flag == 0){ flag = 1; Startstop1.text ="入室時間"; time1.text =""+h+":"+m; reset = getTimer(); }else{ Startstop1.text ="退室時間" time1.text =""+h+":"+m; flag = 0; } return flag; } _______________________________________________________________________________________

    • ベストアンサー
    • Flash
  • ボタンをロールオーバーした時にMCを複製したい

    はじめまして、よろしくお願いします。 表題の通りですが、 ボタンをロールオーバーした時にMCを複製したいのですが、やり方がわかりません。 body(←ボタン名)を押した時に snow(←複製されるMC名)を噴射するような形にしたいです。 フレーム1に書かれたスクリプト------------------- for (count = 1;count<30;count ++) { snow.duplicateMovieClip("snow" + count , count ); } ----------------------------------------------- 複製されるMC(snow)---------------------------------- onClipEvent(load){ xposition = _root.body._x+75; yposition = _root.body._y+75; scale = Math.random()*30+10; speedx = 12-(scale+Math.random()*30+1)/5; speedy = 12-scale/5; this._x = xposition; this._y = yposition; this._xscale = scale; this._yscale = scale; } onClipEvent (enterFrame){ if(this._y>400){ this._y=yposition; this._x=_root.body._x+75; this._alpha = 100; } this._x+=speedx; this._y+=speedy; this._alpha = this._alpha-5; } ----------------------------------------------- 早急に解決しなくてはならなく、困っています。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3.0 でフェードイン、

    AS3.0 でフェードイン、フェードアウトを繰り返したいんです。 _btnをマウスオーバーするとimg_mcがフェードインし、 _btnをマウスアウトするとimg_mcがフェードアウトするというものをつくりたいのですが、 下記スクリプトだと一通り動作を完了すると、ボタンにマウスを持っていっても反応しなくなります。 繰り返し動作させるにはどうしたらよいのでしょうか? var img_mc:MovieClip; img_mc.alpha = 0; _btn.addEventListener(MouseEvent.MOUSE_OVER,xClick0); function xClick0(evt){ img_mc.addEventListener(Event.ENTER_FRAME,imgAlpha); function imgAlpha(event:Event){ img_mc.alpha += 0.05; //スピード if (img_mc.alpha > 1){ img_mc.removeEventListener(Event.ENTER_FRAME,imgAlpha); } } } _btn.addEventListener(MouseEvent.MOUSE_OUT,xClick); function xClick(evt){ img_mc.addEventListener(Event.ENTER_FRAME,imgAlpha2); function imgAlpha2(event:Event){ img_mc.alpha -= 0.05; //スピード if (img_mc.alpha == 0){ img_mc.removeEventListener(Event.ENTER_FRAME,imgAlpha2); } } }

    • ベストアンサー
    • Flash
  • カウントダウンタイマーについて

    カウントダウンタイマーで、クリックするとカウントダウンが始まる設定のコードを見つけましたが、 クリックをしないでもカウントダウンするためには、 どのコードを削ったら良いのかわかりませんでした。。 ご教授頂けたら幸いです。 onClipEvent (load) { cnt = 5*1000; _root.cnt_flg = false; } onClipEvent (enterFrame) { if (_root.cnt_flg) { ms = cnt-(getTimer()-_root.my_time); m = Math.floor(ms/60/1000); s = Math.floor(ms/1000)-m*60; if (ms>=0) { this.TM.text = "あと "+m+"分 "+s+"秒"; } else { this.TM.text = "TIMEOVER!"; } } } on (release) { if (!_root.cnt_flg) { _root.cnt_flg = true; _root.my_time = getTimer(); } }

    • ベストアンサー
    • Flash
  • actionscriptに詳しい方助けてorz

    actionscript3.0を勉強中の初心者です。 現在、フルフラッシュサイトを制作中なのですが、 基本はactionscriptを使用しないで、 作っているのですが、 一部、雪を降らせる演出をactionscriptで実装しています。 そのスクリプトは組めたのですが、 実際にその演出をしたい階層がうまく変更できません。 現状は最前面になっているのですが、 それを最背面の一つ手前にしたいです。 具体的なビジョンとしては 最背面の背景→その上にある画像(部分的に切り抜かれて背景が見えます) この二つの間に雪を降らせたいのですが、 うまくいきません。 何か方法をご存知の方いたら教えていただけると助かります。 スクリプトは下記になります。 addEventListener(Event.ENTER_FRAME , onNewSnow) ; function onNewSnow(eventObj : Event) : void { if (Math.random() <0.3) { var snow_mc:snows = new snows(); snow_mc.x=stage.stageWidth*Math.random(); snow_mc.y=-20; snow_mc.scaleX=snow_mc.scaleY=Math.random()+0.5; addChild(snow_mc); snow_mc.addEventListener(Event.ENTER_FRAME, onSnowStep); } } function onSnowStep(eventObj:Event):void { var target_mc:MovieClip=eventObj.target as MovieClip; target_mc.rotation+=Math.ceil(20/target_mc.scaleX); target_mc.x+=4*Math.random()-2; target_mc.y+=5; if (target_mc.y >(stage.stageHeight+target_mc.height)) { target_mc.removeEventListener(Event.ENTER_FRAME, onSnowStep); removeChild(target_mc); } }

    • ベストアンサー
    • Flash
  • フェードイン、フェードアウトの「オバーラップ」について

    flash初心者です。 AS2.0です。よろしくお願いいたします。 ボタンでムビークリップを切り替える時、 フェードイン、フェードアウトの「オバーラップ」に したいのですが。 (A_mcがフェードアウトする同じタイミングで B_mcがフェードインする) ムービークリップが大量にあるので ムービークリップそれぞれに同一のスクリプトで フェードイン、フェードアウトを設定して効率化 したいと考えています。 フェードインは onClipEvent (load) { this._alpha = 0; } onClipEvent (enterFrame) { if (this._alpha<100) { this._alpha += 2; } } のようなスクリプトで実現できたのですが フェードアウトがわかりません。 ※イメージの関係でフェードアウトがどうしても必要になりました。 onClipEvent (unload) { } のようなタイミングで制御できればと 考えているのですが 具体的にアドバイスいただると助かります よろしくお願いいたします。

  • gotoAndPlayされないです

    はじめてFlashを作ります。 "ATTACK1"と"ATTACK2"のフレームを0.2秒の間隔で10回交互に表示したあと、 "ATTACK3"と"ATTACK4"のフレームをenterが押されるまで交互に表示する というプログラムを作りたいのですが、 "ATTACK1"と"ATTACK2"のフレームを交互にずっと表示されるだけで、 ATTACK3へ移動しません。 "ATTACK1"というラベルのフレームに以下のように書きました。 ActionScript2.0でやっています。 どこが悪いのか教えてください。お願いします。 ATTACK1フレームのActionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; if( count >= 10 ){ gotoAndPlay("ATTACK3"); count=0; delete this.onEnterFrame(); } gotoAndPlay("ATTACK2"); count=count+1; delete this.onEnterFrame(); } } }; ATTACK2フレームのAcctionscript var timeCount = true; var endTime = getTimer()+0.2*1000; stop(); onEnterFrame = function() { if( timeCount ){ time = Math.ceil((endTime-getTimer())/1000); if( time <= 0 ){ timeCount = false; gotoAndPlay("ATTACK1"); delete this.onEnterFrame(); } } };

    • ベストアンサー
    • Flash

専門家に質問してみよう