Hatena::Groupactionscript

dann@actionscript

 | 

2008-08-23

非同期処理まとめ

01:53

以下のまとめが良くまとまっている。

http://www.metaphor.co.jp/masuda/blog/?p=24

FlashDevelopを試す

00:39

vimで書くのは限界があることに気づいた。import文書くのも、ライブラリのドキュメントみるのも大変。とりあえず、FlashDevelopから試してみる。ドキュメントはctagsで何とかカバーできるんだけど。

やっぱり、メソッドのCompletionがあるかないかは初期の学習コストに差がですぎてしまう。特にPapervision3Dのように巨大なフレームワークを使う場合には。IDE使ったほうが数倍速く開発できそう。

ただ、Macで使えないのが... VMWare FusionWindowsいれて使うのもなぁ...

Papervision3Dでの設計

00:29

BasicViewからThreadに処理を委譲。ThreadにModelをDIContainerでインジェクション。Serviceを単体テスト

こんな形になるんじゃないかと思ってる。少しずつ発展させていく。

Cameraの位置とかを誰が管理すべきなのかとか、まだ3D系のクラス設計の勘が働かない。有名どころのソースがあれば読んでみたい。

また、Model?というか物体の移動とか、あーいう表示系のロジックは何をテストすればいいのかわからなくなってくる。ここは3D系のメインになるロジックのはずで、どうテストするのかを少し考えていきたい。

Remotingでビジネスロジック実装

00:29

Flickrからなんかとってくるとか、そういうものをテストするのはそれでいいんだけど、相手側サービスのセキュリティレベルの変更によってクライアントが影響を受けるような設計は、極力避けたほうがいいような気がしていて、基本的にそういう処理はRemotingでBackendeに回るように書くのがいいんじゃないかと思った。仮にクライアントだけでできても。

非同期処理のシーケンスを綺麗に

00:21

幾つかみた感じでは、そーめんが良さそう。例外処理まで考えられているという点で。

event listner地獄から回避するためには、まずこういうライブラリを使うようにしないとダメ。

3Dの物体の座標変換

00:15

行列計算が必ず必要になるのだけれど、papervision3dではMatrix3Dという座標変換用のライブラリが用意されている模様。なるほど。

http://d.hatena.ne.jp/lyokato/20070315/1173930715

AS3用のstarter

| 00:13

githubにcommitした。

asstarter.pl HogeProjectで色々生成される。templateは、.asstarter/templates/default配下をいじればいい。

build.xmlでasdoc, compile, testが実行できるようになってます。

# lyokatoさんに聞いたところだと、airakeがいいらしい。これは今度試してみる。air用としてじゃなくても使えそうとのこと。

AS3のライブラリ

| 00:07

beinteractiveさんの記事がまとまりすぎている。

http://www.be-interactive.org/index.php?itemid=404

Flashのsecurity model

00:06

Essential ActionScriptの19章.

Papervision3D 2.0 GreateWhiteのBasicViewが楽な件

23:55

Scene用意したり、Camera用意したりっていうのが全部抽象化されている。

手順覚える必要がないので、後はstageもしくは、stageの中にDisplayObject3Dつっこんで、そこに表示したい物を追加していけばよいだけ。これは前のバージョンと比べると大分楽になってますね。Main部分のコードだけ書けばいいので、かなり楽になってます。

cooooooooooooooooooooooooooooooooool

Papervision3D + Tweenerで球場の物体を動かす

23:42

複数の球をCubeの頂点にTweenerで移動させるとサンプルを作ってみました。

Papervision3D Greate Whiteを使っています。

package net.mashup4u {
    import flash.display.*;
    import flash.events.*;
    import net.mashup4u.SphereFactory;
    import org.papervision3d.core.proto.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.objects.primitives.*;
    import caurina.transitions.Tweener;
    import net.mashup4u.*;
    import org.osflash.thunderbolt.Logger;

    public class Main extends BasicView {
        private var _rootDisplay: DisplayObject3D;

        public function Flickr3D():void {
            this.setup();
            this.createSpheres();
            this.alignAllSpheresAsCube();
            startRendering();
        }

        private function setup(): void {
            this.setupStage();
            this.setupRootDisplay();
            this.setupListeners();
        }

        private function setupStage(): void {
            stage.quality = "MEDIUM";
        }

        private function setupRootDisplay(): void {
            this._rootDisplay = new DisplayObject3D();  
            scene.addChild(this._rootDisplay);  
        }

        // Refactor: move to a class
        private function createSpheres():void {
            for(var i:int = 0; i < 640; i++ ){
                var sphere:Sphere = SphereFactory.create(i);
                this._rootDisplay.addChild(sphere);
            }
        }

        private function alignAllSpheresAsCube(): void {
            SphereManager.alignAllSpheresAsCube(this._rootDisplay);
        }

        // Refactor: Who is responsible for this method?
        private function moveCameraAtRandom(e:Event): void {
            Tweener.addTween(camera,
                {
                    x:Math.random()*2000,
                    y:Math.random()*2000,
                    z:Math.random()*2000,
                    time:1,
                    transition:"easeOutExpo"
                }
            );
        }

        private function setupListeners():void {
            stage.addEventListener(MouseEvent.CLICK, moveCameraAtRandom);
        }

    }

}
package net.mashup4u {
    import flash.filters.GlowFilter;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.cameras.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.core.proto.*;

    public class SphereFactory {
        public static function create(i:int): Sphere {
            var mm: MaterialObject3D = new ColorMaterial(0xff0000, 0.5);
            var item:Sphere = new Sphere( mm, 7, 4, 4);
            item.name = 'item'+i;
            mm.oneSide = false;
            item.useOwnContainer = true;
            item.filters = [
                new GlowFilter(0xFFFF00, 1, 16, 16, 2, 1, false, false),
            ]; 
            item.alpha = Math.random() + 0.1;
            item.x = Math.random()*3000-1500;
            item.y = Math.random()*3000-1500;
            item.z = Math.random()*3000-1500;
            return item;
        }
    }
}
package net.mashup4u {
    import org.papervision3d.objects.*;
    import caurina.transitions.Tweener;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.objects.primitives.*;

    public class SphereManager {

        public static function alignAllSpheresAsCube(rootDisplay:DisplayObject3D): void {
            var cube:Cube = new Cube(
                new MaterialsList({all:new ColorMaterial(0xFF0000,100)}),
                800,800,800,10,10,10
            );
            var i:int = 0;
            while(i++ < cube.geometry.vertices.length) {
                var item:Object = rootDisplay.getChildByName('sphere'+i);
                Tweener.addTween(
                    item, {
                        x:cube.geometry.vertices[i-1].x,
                        y:cube.geometry.vertices[i-1].y,
                        z:cube.geometry.vertices[i-1].z,
                        time:4,
                        transition:"easeInOutExpo"
                    }
                );
            }
        }
    }

}

TODO

Papervision3Dが大分重い感じですね。置く物体の量によって動作速度が極端にかわるようなので、どれくらいで現実的に動くのか調べたいと思ってます。

ゲスト



トラックバック - http://actionscript.g.hatena.ne.jp/dann/20080823
 |