AS3 Next オリジナルの非同期処理とか

2009/02/22

おはようございます、きんくまです。って、まだ寝てないだけなんですが、、。

今日やってたスターウォーズのAP3ですが、録画している最中に嫁がパソコンを使用して、最後の肝心なところが落ちてしまいました。、、、いや映画館で見たからいいんだけどさ、あの火山の場面とマスクかぶせる場面は見たかったな、、。

さて、Nextです。
あれから、また時間があいちゃったんすが、サイトをみてみたら拡張機能のことが追記してあった!
ありがとうひだちのいろさん。

いろいろとやってみたので、とりあえず動くものをソースと一緒に書きます。

※メモ
ときどきeventのあとの処理で「強制型変換に失敗しました。ObjectなんたらをFunctionに変換できません。」とかでてきたら、function(o:Object){}とか引数の型をObjectにしたらエラーがでなくなった。
あと、tweensyとかをはじめにやろうとするとエラーが出るのも、time(1)とかをくみこんでやったら出なくなった。

ボタンの2を押したあと、4を押すタイミングで行動を振り分け。
全ての処理が終了後、また2の入力受付状態になります。

■ソース

package
{
  import com.flashdynamix.motion.Tweensy;
  import com.flashdynamix.motion.TweensyTimeline;
  import fl.motion.easing.Circular;
  import flash.display.MovieClip;
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.events.TimerEvent;
  import flash.utils.Timer;
  import org.libspark.next.ITrigger;
  import org.libspark.next.Next;
  import org.libspark.next.N;
  import org.libspark.next.Trigger;

  public class Main extends MovieClip
  {
    public var mc1:MovieClip;
    public var mc2:MovieClip;
    public var mc3:MovieClip;
    public var mc4:MovieClip;
    private var tw:TweensyTimeline;

    public function Main()
    {
      loop();
    }

    public function loop():void
    {
      //オリジナル関数を登録
      Next.register("mytween", mytween);
      Next.register("mytween2", mytween2);

      //2をおしたら開始
      setMouseCursor(mc2, true);
      var n:Next = N.event(mc2, MouseEvent.CLICK);

      //カーソル変更
      n.func(function() {
        setMouseCursor(mc2, false);
        setMouseCursor(mc4, true);
      });

      //mytween2がおわるか、mc4を押すか
      n.or([
        N.time(1).mytween2(),
        N.event(mc4, MouseEvent.CLICK)
      ]);

      //結果によってふりわけ
      //戻り値によってはFunctionなんたらの型変換エラーが出るので
      //Objectにしておくと楽
      n.func(function(o:Object) {
        setMouseCursor(mc4, false);

        if (o is String)
        {
          trace(o + " Next!");
        }
        else if(o is MouseEvent)
        {
          var mc:MovieClip = o.target as MovieClip;
          trace(mc.name);

          //mytween2が終わる前にmc4をおしたらmc3を戻す
          tw.yoyo();

          var n2:Next = N.time(1).mytween(mc1, { x:Math.random() * stage.stageWidth, y:Math.random() * stage.stageHeight }, Circular.easeIn);
          n2.start();
        }
      });

      //全部終わったらもう一回受付まち
      n.func(function() {
        loop();
      })

      //処理開始
      n.start();
    }

    private function setMouseCursor(target:MovieClip, isSet:Boolean):void
    {
      target.useHandCursor = target.buttonMode = isSet;
    }

    private function mytween(target:MovieClip, params:Object, easing:*):ITrigger
    {
      var t:Trigger = new Trigger();
      var tw:TweensyTimeline = Tweensy.to(target, params, 0.8, easing);
      tw.onComplete = function()
      {
        t.call("complete");
      }
      return t;
    }

    private function mytween2():ITrigger
    {
      var t:Trigger = new Trigger();
      if(tw != null) Tweensy.remove(tw);
      tw = Tweensy.to(mc3, { x:Math.random() * stage.stageWidth, y:Math.random() * stage.stageHeight },
      5, Circular.easeOut);
      tw.onComplete = function():void
      {
        t.call("hello");
      }
      return t;
    }
  }

}
LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

ページトップへ戻る