• 締切済み

繰り返し

両腕・両足があり、下記のコードは回転になっています。 これを、例えば20度から45度へ傾き、またそこから20度に戻る動きを 繰り返すようにさせたいです。 それと、右腕・左足が45度になった時、左腕・右足が動きだし 交互に動きになるようにするにはifで出来るのでしょうか? robo.arm_r.addEventListener(Event.ENTER_FRAME,arm_right); function arm_right(event:Event):void {  robo.arm_r.rotation += 3; } robo.arm_l.addEventListener(Event.ENTER_FRAME,arm_left); function arm_left(event:Event):void {  robo.arm_l.rotation += 3; } robo.leg_r.addEventListener(Event.ENTER_FRAME,leg_right); function leg_right(event:Event):void {  robo.leg_r.rotation += 3; } robo.leg_l.addEventListener(Event.ENTER_FRAME,leg_left); function leg_left(event:Event):void {  robo.leg_l.rotation += 3; }

みんなの回答

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

ムービークリップのrotation値は, そのムービークリップが作成された状態からの角度です。 配置された状態からの角度ではありません。 また rotation の値は -180~180 です。 この範囲を超えると自動計算し直されますが -180や180前後の値を絶対的に操作する場合は少々厄介です。 この辺が絡むとムービークリップの作成のしかたや 配置のしかたによってスクリプトは変わりますが あえて変わらないようにすると次のような感じになると思います。 ただし,向かって右側の手を 「arm_r」 と考えています。 左手・右脚・左脚も同様で 作者から見た左右 としています。 また「20度から45度」の意味がわかりませんでしたので 「『配置した状態から』20度~45度の範囲で動く」 場合を想定しています。 ==================================== //--※ムービープレビュー確認用-- trace (robo.arm_r.rotation); trace (robo.arm_l.rotation); trace (robo.leg_r.rotation); trace (robo.leg_l.rotation); //------------------------- //---初期設定-------------- //最小角を設定 var min_r:Number = 20; //最大角を設定 var max_r:Number = 45; //1フレーム時間で回転する角度を設定 var spd_r = 3; //------------------------- //手足の初期配置角度を保存 var arm_r0 = robo.arm_r.rotation; var arm_l0 = robo.arm_l.rotation; var leg_r0 = robo.leg_r.rotation; var leg_l0 = robo.leg_l.rotation; //手足の回転を配置された状態から最小角に回転 robo.arm_r.rotation = arm_r0 + min_r; robo.arm_l.rotation = arm_l0 - min_r; robo.leg_r.rotation = leg_r0 + min_r; robo.leg_l.rotation = leg_l0 - min_r; //回転させる数値を代入する変数を用意(初期値は最小値) var rot:Number = min_r; //プラスマイナスを決める変数を用意(初期値「+」) var pm:int = 1; //roboに毎フレーム実行するイベントリスナーを追加 robo.addEventListener (Event.ENTER_FRAME,moveArm); //関数moveArmの定義 function moveArm (event:Event):void { rot += pm * spd_r; event.target.arm_r.rotation=arm_r0+rot; event.target.arm_l.rotation=arm_l0-rot; if (rot>max_r) { robo.removeEventListener (Event.ENTER_FRAME,moveArm); robo.addEventListener (Event.ENTER_FRAME,moveAll); } } //関数moveAllの定義 function moveAll (event:Event):void { if (rot>max_r) { pm=-1; } else if (rot<min_r) { pm=1; } rot+=pm*spd_r; event.target.arm_r.rotation=arm_r0+rot; event.target.arm_l.rotation=arm_l0-rot; event.target.leg_r.rotation=leg_r0+(max_r+min_r)-rot; event.target.leg_l.rotation=leg_l0-(max_r+min_r)+rot; } ====================================   

chiko_808
質問者

お礼

BlurFiltan 様 ご丁寧に画像付きで、ご回答頂きましてありがとうございます。 今の私では、到底書けないレベルで読み解くのが困難ですが 勉強になりました。 ありがとうございました。

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

関連するQ&A

  • actionscript3.0 rotationについて

    actionscript3.0 rotationについて btnを押すごとにmcを時計回りに90度減速させながら回転させたいと思っています。 しかし2回ボタンを押して180度回転させるまではうまくいくのですが 3回目に270度になると、回転がとまりません。 分岐させて、-90度回そうと思うと(当たり前ですが)逆回転してしまいます。 どのように記述すればよいでしょうか? よろしくお願いします。 以下スクリプトです。 var i:int=0; function onEnter(event:Event):void{ mc.rotation += (i-mc.rotation)*0.1; } addEventListener(Event.ENTER_FRAME, onEnter); btn.addEventListener(MouseEvent.MOUSE_DOWN, MouseLDownFunc); function MouseLDownFunc(event:MouseEvent):void{ i+=90; };

    • ベストアンサー
    • Flash
  • addEventListenerでムービークリップ名を渡す

    AS3です。 複数のムービークリップに対し、 同じ処理をしたいのですが、 下記の書き方だと、かなり効率が悪いのですが、 mc1.addEventListener(Event.ENTER_FRAME, test); function test(event:Event):void{ trace(mc1.x); } mc2.addEventListener(Event.ENTER_FRAME, test1); function test1(event:Event):void{ trace(mc2.x); } functionの方は大体同じ処理なので、 trace(mc1.x);←ここのmc1を動的に 処理することはできないのでしょうか。 やりたいことはこんな感じです。 mc1.addEventListener(Event.ENTER_FRAME, test); mc2.addEventListener(Event.ENTER_FRAME, test); mc3.addEventListener(Event.ENTER_FRAME, test); function test(event:Event):void{ trace(【ここにそれぞれmc1,mc2,mc3が呼ばれる感じ】.x); } ご教授お願いいたします。

    • ベストアンサー
    • Flash
  • ActionScript3.0 初心者です

    ActionScript3.0 初心者です。 ムービークリップballに対して、以下のようなスクリプトを書いて、 ロールオーバーすると徐々に大きく、 アウトすると徐々に小さくなるようにしています。 しかし、初めはうまくいくのですが、 オーバー、アウトの回数を重ねるごとに、 縮尺の間隔が短くなってしまいます。 常に同じ間隔で縮尺させるにはどうすればいいのでしょうか? よろしくお願いします。 ball.addEventListener (MouseEvent.MOUSE_OVER, r_over); ball.addEventListener (MouseEvent.MOUSE_OUT, r_out); var c:int; var nDeceleration:Number = 0.1; function r_over(event:MouseEvent):void { c = 400; ball.addEventListener(Event.ENTER_FRAME, ballsize); function ballsize(event:Event):void { if(ball.width==c){ ball.removeEventListener(Event.ENTER_FRAME,ballsize); } else{ ball.width +=(c - ball.width) *nDeceleration; ball.height +=(c - ball.height) *nDeceleration; } } } function r_out(event:MouseEvent):void { c = 150; ball.addEventListener(Event.ENTER_FRAME, ballsize); function ballsize(event:Event):void { if(ball.width==c){ ball.removeEventListener(Event.ENTER_FRAME,ballsize); } else{ ball.width +=(c - ball.width) *nDeceleration; ball.height +=(c - ball.height) *nDeceleration; } } }

  • Actionscript3.0 子のイベントを削除

    Actionscript3.0で親のムービーから子のイベント指定して削除することは可能でしょうか? 親のステージに配置したmymcの中でballをENTER_FRAMEを使い動かしています。 親のステージに配置したbtnをクリックすることで、 ENTER_FRAMEを削除したいのですが、 下記のスクリプトだと、親のほうでmyenterframeが未定義と表示されてしまいます。 どのように記述すればよいのでしょうか? よろしくお願いいたします。 ーーーーーーーーーーーーーーーーー親ーーーーーーーーーーーーーーーーー btn.addEventListener (MouseEvent.CLICK, myclick); function myclick(event:MouseEvent):void{ mymc.removeEventListener(Event.ENTER_FRAME, myenterframe); } ーーーーーーーーーーーーーーーーーmymcーーーーーーーーーーーーーーーーー addEventListener(Event.ENTER_FRAME, myenterframe); function myenterframe(evt:Event):void { ball.x++; }

    • ベストアンサー
    • Flash
  • AS3.0 Timerの使い方

    AS3.0 Timerの使い方 a_mc、b_mc、c_mcがあり、a_mcが再生された1秒後にb_mcを作動させ b_mcが再生された0.5秒後にc_mcを再生というようにしたいのですが その場合、Timerはどのようにすれば良いのでしょうか? 初心者ですので、なるべく基本的な作り方が理想です。 下記のコードを参照にして頂ければと思います。 また、下記で間違っている部分がありましたらご指摘ください。 Flash CS3を使用しております。 宜しくお願い致します。 a_mc.y = 450; b_mc.y = 450; c_mc.y = 450; a_mc.alpha = 0; a_mc.addEventListener(Event.ENTER_FRAME, a_up); function a_up(event:Event):void { a_mc.y -= 2; a_mc.x -= 1; a_mc.alpha += 0.03; if (a_mc.y == 200) { a_mc.removeEventListener(Event.ENTER_FRAME, a_up); } } b_mc.addEventListener(Event.ENTER_FRAME, b_up); function b_up(event:Event):void { b_mc.y -= 2; b_mc.rotation += 6; if (b_mc.y == 200) { b_mc.removeEventListener(Event.ENTER_FRAME, b_up); } } c_mc.addEventListener(Event.ENTER_FRAME, c_up); function c_up(event:Event):void { c_mc.y -= 2; c_mc.x += 1; if (c_mc.y == 200) { c_mc.removeEventListener(Event.ENTER_FRAME, c_up); } }

    • ベストアンサー
    • Flash
  • AS 3 mouseout & over

    以下のようにMOUSEOUT,MOUSEOVERをつかって、 インスタントにマウスオーバーするとその幅が増えていき、幅200のところで止まる。 インスタントからマウスアウトするとその幅が減っていき、幅60のところで止まる。 という事を意図して、記述しました。 しかしながら、マウスオーバーの内容は意図した通りのいくのですが、 マウスアウトの場合は少し幅が減っただけで、すぐに止まってしまいます。 どのように直せば、意図した通りに行くのでしょうか? お知恵をいただければ幸いです。 package { import flash.events.MouseEvent; import flash.events.Event; import flash.display.Sprite; public class main extends Sprite { var _sikaku:Sprite = new Sprite(); public function main(){ _sikaku.graphics.lineStyle(6,0x330066); _sikaku.graphics.drawRect(0,0,120,120); this.addChild(_sikaku); _sikaku.addEventListener(MouseEvent.MOUSE_OVER,big_off); _sikaku.addEventListener(MouseEvent.MOUSE_OUT,big_on); function big_on(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,tijimi); function tijimi(event:Event):void { if(_sikaku.width==60 ) { _sikaku.removeEventListener(Event.ENTER_FRAME,tijimi); } if(_sikaku.width > 60) { _sikaku.width -= 1} trace("stop!") } } function big_off(event:Event):void { _sikaku.addEventListener(Event.ENTER_FRAME,kakudai); function kakudai(event:Event):void { if(_sikaku.width < 200) { _sikaku.width += 1 trace("stop?") } if(_sikaku.width == 200) { _sikaku.removeEventListener(Event.ENTER_FRAME,kakudai); } } } } } }

  • ボタンについて(CS4,AS3)

    HPのメニュー用に、クリックするとフレーム移動するボタンを作っています。 フレーム1以外のフレームには、フレーム1に設置してあるボタンで指定したフレームとは異なるフレームに 移動させたいので、新たにフレーム1のボタンとは別のボタンを設置しています。 プレビューでフレーム1のボタンをクリックすると正常に動くのですが、 フレームが移動した後に再度ボタンをクリックすると動かず、全てのボタンが反応しません。 ■フレーム1に設置してあるボタン test_a1.addEventListener(MouseEvent.CLICK , testA1); test_b1.addEventListener(MouseEvent.CLICK , testB1); test_c1.addEventListener(MouseEvent.CLICK , testC1); function testA1(event : MouseEvent) :void{ gotoAndPlay(1); } function testB1(event : MouseEvent) :void{ gotoAndPlay(51); } function testC1(event : MouseEvent) :void{ gotoAndPlay(101); } ※フレーム1、51、101にはstop();で停止するようにしています。 ■フレーム51に設置してあるボタン test_a2.addEventListener(MouseEvent.CLICK , testA2); test_b2.addEventListener(MouseEvent.CLICK , testB2); test_c2.addEventListener(MouseEvent.CLICK , testC2); function testA2(event : MouseEvent) :void{ gotoAndPlay(11); } function testB2(event : MouseEvent) :void{ gotoAndPlay(61); } function testC2(event : MouseEvent) :void{ gotoAndPlay(111); } コンパイルエラーは出ていません。 ネットで調べても何故、フレーム1以外のボタンが動かないのか分かりません。 どなた様か教えていただけると助かります。 使用しているソフトはAdobe Flash CS4で、スクリプトはActionScript3.0です。 よろしくお願いします。

  • ムービークッリプを所定の位置まで動かしたいのですが

    AS初心者なのですが、この度AS3.0を覚える事になり、現在勉強中です。 数冊本を購入し、読んではいるのですが基本的な文法の説明と簡単な作例(と言う程でもないサンプル)だけ載っているものが殆どで、その文法をどう使って組んで行けば良いのかが殆ど解らない状況です。 早速質問なのですが 三つのボタンにロールオーバー、ロールアウト、オンクリック時動きをつけたいのですが、どうも上手く行きません。 ソースは stop(); bt01.addEventListener(MouseEvent.CLICK, gotoURL1); bt01.addEventListener(MouseEvent.ROLL_OVER, bt01_RollOver); function gotoURL1(event:MouseEvent):void { var theURL1:URLRequest = new URLRequest("URL"); navigateToURL(theURL1); } function bt01_RollOver(event:MouseEvent):void { main_bg1.addEventListener(Event.ENTER_FRAME, movebg_01); function movebg_01(event:Event):void { main_bg1.x -= 60; main_bg2.x -= 60; if(main_bg1.x >= -960) { main_bg1.removeEventListener(Event.ENTER_FRAME, movebg_01); } } } 以上です。 すべてフレームに記述しています。 先輩方、どうかご教授よろしくお願い致します。

  • 何で重なり合おうとするんでしょうか??

    http://image44.bannch.com/bbs/43055/img/0246411068.swf 上記ページを見てください。 var cnt:int=0; var myTimer:Timer=new Timer(2000,0); function moveMC(e:Event):void { if (mc.x<250) { if (mc.x<cnt*50) { mc.x+=10; } }else { mc.x=0; cnt=0; }} function moveMM(e:Event):void { if (mm.x<250) { if (mm.x<cnt*50) { mm.x+=10; } }else { mm.x=-600; cnt=0; }} function startMC(te:TimerEvent):void { cnt++; mc.addEventListener(Event.ENTER_FRAME,moveMC); } function startMM(te:TimerEvent):void { cnt++; mc.addEventListener(Event.ENTER_FRAME,moveMM); } myTimer.addEventListener(TimerEvent.TIMER, startMC); myTimer.addEventListener(TimerEvent.TIMER, startMM); myTimer.start(); startMC(null); startMM(null); なんで重なろうとするんでしょうか??僕としては、これらの画像を広告のようにして、企業サイト(例:東洋水産)等のトップページによくあるFLASHにしたいのですが。

    • ベストアンサー
    • Flash
  • AS3.0で拡大縮小と透明度調整

    FLASH初心者です。 FLASHのActionscript3.0を使ってタイトルが透明度をフェードインフェードアウトさせながらゆっくり拡大していくようなアニメーションを作成しようと思いますが、どういったスクリプトを書けばいいのか分かりません。 現状では intro.addEventListener(Event.ENTER_FRAME,function(event){ intro.alpha *= 0.98; }); intro.addEventListener(Event.ENTER_FRAME,function(event){ intro.scaleX += 0.005; intro.scaleY += 0.005; }); このように記述していますが、 この状態ではゆっくりフェードインが再現できないので、手詰まりの状態になりました。 フェードインフェードアウトを再現するために何か良い方法は無いでしょうか? 是非ともご教授いただければと思います。

    • ベストアンサー
    • Flash