FC2ブログ
  • 08 «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • » 10
ASOK?
ActionScriptでFlashつくるよ
Progression4でシーン遷移が正しく行われないトラブル。
表示上は遷移完了しているように見えるが、ブラウザURLが変わってないし、ログ見てもシーンに移動中のまま。

シーン遷移途中では、ボタンを殺すようにしたら直った。
ちゃんと検証していないが、シーン遷移中にコマンドを実行するのがまずいのか?(要検証!)

ページ遷移時のアニメーションが、途中で止まってしまう症状にも悩まされていたが、どうやら原因は同じだったようで、上記の対処で解決。

page top

無駄な遠回りをした話。たぶん誰の役にも立たない情報。

通常コマンドリストの中断、再開には、Func.listen()を使います。
先日asynchronous jpeg encodingを使う機会がありました。非同期のjpegエンコーダです。
これがEventDispatcherではなくて、コールバックFunctionを引数に渡してコールする形。
Func.listen()が使えないぞと。どうしたものか。とりあえずリファレンスから使えそうなものを探す。

Func.unlisten()は?

Func.unlisten()はイベント待ちを解除するだけで、再開はしてくれない。

SerialList.positionは?

SerialList.positionは読み取り専用。

SerialList.nextCommand()は?

SerialList.nextCommand()も外部からはアクセスできない。

SerialList.interrupt()で中断、execute()で再開できないか?

ダメでした。execute()すると最初から実行してしまう。 interruptTypeを変更しても変化なし。

LoopList.stop()を使う?!

Progression4 LoopListを試してみた | 2BLOG

検索してて上記エントリを発見。LoopList.stop()が使えそうだ。試してみるとstop()で中断、execute()で再開できる。
がっ!単独で使う分には問題ないが、CommanList内で使う場合、stop()でLoopList自体は中断するものの、親のCommandListは進行してしまう!
というわけで、これもダメ…。

結局Func.listen()

よくよく考えてみると、Func.listen()使って、コールバックで適当なEventDispatcherからイベント発行すればいいじゃん。
というわけで、SerialList自体のカスタムイベントを使うことで解決した。

オレあほだ…

page top

コマンドをずっと実行させ続けたい場合のやり方。

  1. LoopListを使う
  2. どんなに長くなろうと気にせずSerialList
  3. clearCommandで実行したコマンドを消しつつaddCommand

LoopListを使う

普通はLoopListを使うことを考えるだろう。でも、うまくない時もある。例えば、LoadURLで毎回パラメータを変えたい場合など。

どんなに長くなろうと気にせずSerialList

試しにコマンド10000個だと、定義だけでタイムアウト。1000個では大丈夫だったけど、一抹の不安が残る。

clearCommandで実行したコマンドを消しつつaddCommand

ミソは、Funcコマンドから関数を呼び出してるところと、clearCommand(true)。

page top
たぶんCastXXXXをViewControllerにして、SceneObjectをControllerにすればいいんだろな。
ただし、SceneObject以外にもControllerはあっていい。
Modelを忘れないように。

Progressionの構成がViewまわり主体になっていて、チュートリアル見てもView主体なので、どうも惑わされてしまう…。
page top

AddChildの挙動を研究のつづき。

(結局)AddChildコマンドのソースを覗いてみる。

AddChildコマンドの処理内容

addChid()する。
引数childが ExecutorObject を実装して、かつ引数containerが存在しない場合、
 ExecutorObject が実行中なら中断し、
 イベントリスナ登録し、(EXECUTE_COMPLETE、EXECUTE_INTERRUPT、EXECUTE_ERROR)
 ExecutorObject に execute( new CastEvent( CastEvent.CAST_ADDED ), super.extra ) を実行。

RemoveChildコマンドの処理内容

引数childが ExecutorObject を実装して、かつ引数containerが存在しない場合、
 ExecutorObject が実行中なら中断し、
 イベントリスナ登録し、(EXECUTE_COMPLETE、EXECUTE_INTERRUPT、EXECUTE_ERROR)
 ExecutorObject に execute( new CastEvent( CastEvent.CAST_REMOVED), super.extra ) を実行。
removeChild()する。

page top
Copyright © 2005 ASOK?. all rights reserved.