Papervision3D:各 View 要素からの参照方法(考え方)

例えば、下記の様な構成が papervision3D コンテンツにあったとして、

PaperVision3D View 概要図

Item.as から TestView3D.as 内の BasicView, viewport3D, CameraObject3D, CameraObject3D.target, Mouse3D などを参照したい場合、Item クラスは DisplayObject3D の子クラスなので参照を持っていない。

これまではインターフェースに下記の様な function setAsset(view:BasicView, viewport:Viewport3D, camera:CamerObject3D) 的な関数を設定して各 DisplayObject3D の子クラスを作成し、各構成要素が override して受け渡していたんだけど、いちいち設定したり構成が深くなると面倒くさかったりしていた。

package com.convexstyle.view3D.bases
{
    public class CFObject3D extends DisplayObject3D implements ICFObject
    {
        protected var _view:BasicView;
        protected var _viewport:Viewport3D;
        protected var _camera:CameraObject3D;
        public function CFObject3D()
        {
        }
        public function setAsset(view:BasicView, viewport:Viewport3D, camera:CamerObject3D):void
        {
            this._view     = view;
            this._viewport = viewport;
            this._camera   = camera;
        }
    }
}
package view.contents.items
{
    public class Item extends CFObject3D
    {
        public function Item()
        {
            super();
        }
        override public function setAsset(view:BasicView, viewport:Viewport3D, camera:CamerObject3D, ...)
        {
            super.setAsset(view, viewport, camera);
        }
    }
}

自分の AS3 のフレームワークの中では PHP の流れというか心地よいと言うか、クラスディレクトリ直下に conf/Config.as を必ず置いてアプリケーションで統一して使用する静的変数や定数を管理しているんですが(本来は model 要素だと思うけど。)ここに下記の様に必要な要素を設定しておいて、BasicView 生成時に参照を設定しておく後々楽。

package conf.Config
{
    class Config
    {
        public static var view3D:TestView3D;
        public static var viewport:Viewport3D;
        public static var camera:CameraObject3D;
        public static var cameraTarget:DisplayObject3D;
        public static var mouse3D:Mouse3D;
        等
    }
}

後は BasicView 生成時に init 関数などで設定しておけば後々、各 DisplayObject3D の子クラスから参照が楽になる。

package view.contents
{
    public class TestView3D extends View3D
    {
        public function TestView3D()
        {
            super(Config.View3DWidth, Config.View3DHeight, true, true, Config.CameraType);
            this.init();
        }
        private function init()
        {
            var cameraTarget:DisplayObject3D = new DisplayObject3D();
            this.scene.addChild(cameraTarget);
            Config.view3D       = this;
            Config.viewport     = this.viewport;
            Config.camera       = this.camera;
            Config.cameraTarget = cameraTarget;
        }
    }
}
package view.contents.items
{
    public class Item extends CFObject3D
    {
        public function Item()
        {
            super();
        }
        private function init():void
        {
            trace('BasicView: ' + Config.view);
        }
    }
}

自分的にはこの考えがシンプルで気楽。
他にも色々良いやり方があったら是非是非教えてください!

・・・・・

PC を持ってカフェの電源につないで人の会話の中開発すると効率がはかどるカフェデベロッパーの自分ですが、シドニーは意外にもカフェがいつも混んでて全くコンセントが使えん。。。この点だとバンクーバーは良かったなあー。24時間営業でガラガラだったし。

ページの一番上へ移動

トラックバック

この記事へのトラックバック URL は下記の通りです。
http://www.convexstyle.net/mt/mt-tb.cgi/118

コメントの投稿

初めて投稿される方のコメントは管理者の承認が必要となります。ご了承ください。