Thread(そうめん)× Away3D × Blenderで作成(僕がそうめんを使う理由的な)
August 22, 2008
Away3DのColladaアニメーションと、先日参加した「そうめんワークショップ」のおさらいを兼ねて作成。
作る際に気がついたことなど次の順に書いときます。
1.Actionscript Thread Library(そうめん)
2.Away3D
3.Blender
Actionscript Thread Library(そうめん)
使ってみて感じたこと。
1.addEventListenerぜんぜん使わなくなった
具体的には1箇所だけ使った(スレッドの構成ちゃんとすればなくすこと可能)。
2.順序だててプログラミングできる
addEventListenerを使うと、ハンドラメソッドに飛んで、そこからつぎに飛んで、、、という感じにあっち行ってこっち行って、となり、そのうち頭もこんがらがっていく。
スレッド使うと、メインの処理にスレッドをだーっと並べておけば、それが処理の流れそのものになり、順序だててプログラミングするのが楽でした。
3.あとからソースをみたときにわかりやすい
2で述べたように処理の流れはスレッドの順序を見ればわかり、その内容は個々のスレッドクラスを見ればわかる。というわけで、わかりやすい。
4.わりととりかえしがつく
(遠い目をしながら)addEventListener時代はイベントの順序を変えたくなったときに、手間がかかった。
「そうめん」使えば、スレッドの順序をかえてやるだけでいい。
スレッドを順番に処理してくれるシリアルエグゼキュータ(SerialExecutor)を使っていれば、なお簡単。
次のソースだとaddThreadした順番に処理が行われるので、addThreadする順番を変えてやればいい。
var serialExec:SerialExecutor = new SerialExecutor();
serialExec.addThread(initThread);
serialExec.addThread(loaderThread);
serialExec.addThread(loadedThread);
serialExec.addThread(displayThread);
serialExec.addThread(away3dControlThread);
serialExec.start();
些細かもしれないけれど、おっ、これいいじゃんという使い道。
ローディング表示で、100%になったら「complete !」と出して、しばらくしてからそれを削除して、コンテンツを表示する場合。
次のように書くと、2秒たってからその次の処理に行く。そこでremoveChild。
これまではタイマー使ってとかしてました。
loading.gotoAndPlay("complete");
sleep(2 * 1000);
そうめんワークショップの懇親会で、Beintaractive !様とProgressionとの併用についてちらっと話したところ、「個々のページクラス内でスレッド使うといいかも」と言っていたけれど、確かに。
Away3Dの話
今回、rev.612で作成。
rev.613以降だとオブジェクトがそもそも表示されないという事態に(れいによってBlenderから書き出したdaeの問題だと思いますが)。
また、rev.612で次のようにColladaにマテリアルセットしたところ、うまく反映せず(前はうまくいった気がした)。
_loader = Collada.load("./dae/people.dae",{material:new MovieMaterial(material)});
Blenderの話
note.x様も書いている通り、アニメーション付きdaeを作成する際、注意することがある。
今回はそのうちのふたつを反映しています(時が解決してくれるのかな)。
1.ルートボーンを二つにする
2.ボーン名にドットが含まれないようにする(Arm.RならArm_Rにしとく)
それぞれ入手先
Actionscript Thread Library(そうめん)
Away3D
Blender
最後に
「そうめんワークショップ」行ってよかったと実感。
開発者の口から開発者の言葉で話を聞くことで、ドキュメントの裏側に触れられる気がする。
9月4日のProgressionイベントも行きたいところ。
さとなお.comに次の一文がある。
「社外の人間と飲め。社内の人間とばかり飲んでるヤツはバカと思え」
世に広めたい言葉だと思った。
僕はと言うと、今年後半戦、勉強会やワークショップは都合つく限り行きたい。
カテゴリー:
タグ:
Trackback
Trackback URL for this entry:
Comment (3)
hanakoogura:scratchbrain様
以前『typeWriter - version1.0.0』で
大変お世話になりました、
小椋ハナコです。
こんばんは!
実は今、超初心者ながら『Thread』に挑戦し、
(当然ながら)行き詰っております。。。
お知恵を拝借する場でない事は重々承知しているのですが、
何卒、御助言頂けないでしょうか(頭垂)。
「そうめん」を使用したスライドショーを作成し
(A.swf : Main.as, MainThread.as, ImgLoad.as, Fade.asで構成)、
そのA.swfを別のflaファイルに読み込もうとすると、
以下のようなエラーが出てしまいます。
TypeError: Error #1009: null のオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません。
at Main$iinit()
Main.asの内容は以下になります---
=== Main.as ===
package
{
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.events.Event;
import flash.display.MovieClip;
import flash.display.Sprite;
import org.libspark.thread.Thread;
import org.libspark.thread.EnterFrameThreadExecutor;
public class Main extends Sprite
{
public function Main()
{
stage.scaleMode=StageScaleMode.NO_SCALE;
stage.align=StageAlign.TOP_LEFT;
//Threadのイニシャライズ
Thread.initialize(new EnterFrameThreadExecutor());
//MainThread開始
var main:MainThread = new MainThread(this);
main.start();
trace("parent ="+ parent);
trace("this ="+ this);
trace("this.parent ="+ this.parent);
trace("stage.root ="+ stage.root);
trace("stage ="+ stage);
trace("root ="+ root);
trace("root.parent ="+ root.parent);
}//end of function
}//end of class
}//end of package
---また、読み込むfla側のスクリプトはこんな感じです---
var loader : Loader = new Loader();
// ロード完了時にloadCompメソッドを呼び出すようイベントリスナーを追加
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, loadComp );
// A.swfをロードする
loader.load( new URLRequest( "A.swf" ) );
function loadComp( event : Event ) {
// イベントリスナーの削除
loader.contentLoaderInfo.removeEventListener( Event.COMPLETE, loadComp );
// ステージにA.swfを追加
this.addChild(loader);
}
---
以前お書きになっていた
『ステージの参照とシングルトン #1~#3』
等に関連があるように思い、
子swfと親swfにおけるroot/stage参照など
色々と検索したりしてみたのですが、
結局解決できませんでした(涙)。
押しかけ質問で、
本当に、本当に、申し訳ありませんが、
御助言頂けないでしょうか。
*ちなみに、traceの結果は以下になります---
parent =[object Stage]
this =[object App]
this.parent =[object Stage]
stage.root =[object Stage]
stage =[object Stage]
root =[object App]
root.parent =[object Stage]
稚拙な説明で貴重なお時間を台無しにしてしまっていたら申し訳ありません。
小椋
お世話になっております。
昨日こちらで(勝手に)ご相談させて頂いた「そうめん」関連の件ですが、
無事自己解決することができましたのでご報告にあがりました。
(要は、子swfのstage参照が問題だったみたいです)
お忙しいところをお邪魔して大変申し訳ありませんでした。
お仕事がんばって下さい。
失礼します。
小椋
小椋様
こんにちは。
解決したみたいで良かったです。
(実はまだ昨日のコメントじっくり読めていませんでした、、)


















