forked from: Papervision3Dでマウスイベントを設定する(2)

by kinoppy forked from Papervision3Dでマウスイベントを設定する(2) (diff: 1)
♥0 | Line 107 | Modified 2011-02-15 16:54:35 | MIT License
play

ActionScript3 source code

/**
 * Copyright kinoppy ( http://wonderfl.net/user/kinoppy )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/wN0m
 */

// forked from kamipoo's Papervision3Dでマウスイベントを設定する(2)
/**
 * Papervision3D で マウスイベント を設定する(2)
 * MovieMaterial のテクスチャに マウスイベント を設定する方法
 */
package
{
    import com.bit101.components.TextArea;
    
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    import org.libspark.betweenas3.BetweenAS3;
    import org.libspark.betweenas3.tweens.ITween;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.proto.MaterialObject3D;
    import org.papervision3d.events.InteractiveScene3DEvent;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.MovieMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Plane;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    
    [SWF(backgroundColor="#FFFFFF", width="465", height="465", frameRate="30")]
    public class PV3DMouseEvent2 extends Sprite
    {
        
        //PV3Dに使用する変数
        protected var _scene:Scene3D;
        protected var _viewport:Viewport3D;
        protected var _renderer:BasicRenderEngine;
        protected var _camera:Camera3D;
        
        //表示するテクスチャ
        protected var _texture:Sprite;
        
        //表示に使用するマテリアルを格納する変数
        protected var _material:MaterialObject3D;
        
        //表示するプリミティブ(Plane:板、Cube:立方体 など)を格納する変数
        protected var _primitive:DisplayObject3D;
        
        public function PV3DMouseEvent2()
        {
            super();
            
            //3D表示に必要なクラスを初期化します
            _init3D();
            
            //3D表示に必要な情報を設定します
            _setup3D();
            
            //3D空間に追加するオブジェクトを生成します
            _initObject();
            
            //生成したオブジェクトに マウスイベント を設定します
            _setupObject();
            
            //毎フレーム レンダリングを行います。
            addEventListener( Event.ENTER_FRAME, _enterframeHandler );
            
            
            //ログ出力を初期化します(無視して結構です。)
            _initLogger();
        }
        
        /**
         * PV3Dでボタンを使えるようにセットアップします。
         */
        protected function _setup3D():void
        {
            //Viewport3D の interactive プロパティを true に設定します。
            //※Viewport3D の コンストラクタ の 第4引数 を true に設定してもよい
            _viewport.interactive = true;
        }
        
        /**
         * PV3Dのオブジェクトを追加します。
         */
        protected function _initObject():void
        {
            //マウスイベント を設定する テクスチャ を生成します。
            _texture = new Sprite();
            _texture.graphics.beginFill( 0x000000, 1 );
            _texture.graphics.drawRect(0, 0, 100, 100);
            _texture.graphics.endFill();
            
            //MovieMaterial の テクスチャ に直接マウスイベントを設定すると
            //正常にマウスイベントが受け取れなくなるため Sprite で包みます。
            var container:Sprite = new Sprite();
            container.addChild( _texture );
            
            _material = new MovieMaterial( container, false, false, false, null);
            
            //マテリアルの interactive プロパティを true に設定します。
            _material.interactive = true;
            
            //裏面の描画を有効化します。
            _material.doubleSided = true;
            
            //今回は Plane を追加します。
            _primitive = new Plane( _material, 100, 100, 1, 1 );
            
            //シーンに追加します。
            _scene.addChild( _primitive );
            
            //3Dなのでオブジェクトを回転させておきます。
            var t:ITween = BetweenAS3.to(_primitive, {rotationY: 360}, 10);
            t.stopOnComplete = false;
            t.play();
        }
        
        /**
         * PV3Dに追加したオブジェクトにマウスイベントを設定します
         */
        protected function _setupObject():void
        {
            _texture.addEventListener( MouseEvent.ROLL_OVER, _logEvent );
            _texture.addEventListener( MouseEvent.ROLL_OUT, _logEvent );
            _texture.addEventListener( MouseEvent.CLICK, _logEvent );
        }
        
        /**
         * オブジェクトをクリックした時に発生するイベント
         */
        protected function _logEvent(e:Event):void
        {
            //Viewport3D の buttonMode を true 設定すると
            //Viewport3D に描画されているすべてのオブジェクトにオンマウスで指アイコンになってしまうので、
            //Viewport3D の buttonMode を イベントタイプによって切り替える
            switch( e.type) {
                case InteractiveScene3DEvent.OBJECT_OVER: 
                case MouseEvent.ROLL_OVER: _viewport.buttonMode = true; break;
                case InteractiveScene3DEvent.OBJECT_OUT: 
                case MouseEvent.ROLL_OUT: _viewport.buttonMode = false; break;
                default: break;
            }
            
            //出力する
            log( e.type );
        }
        
        /**
         * PV3Dを初期化します。
         */
        protected function _init3D():void
        {
            _scene = new Scene3D();
            _viewport = new Viewport3D( stage.stageWidth, stage.stageHeight - 100, false, false, true, true );
            _renderer = new BasicRenderEngine();
            _camera = new Camera3D();
            _camera.z = -(_camera.zoom * _camera.focus);
            addChild( _viewport );
        }
        
        /**
         * PV3Dを描画します。
         */
        protected function _render():void
        {
            _renderer.renderScene( _scene, _camera, _viewport );
        }
        
        
        protected function _enterframeHandler(e:Event):void
        {
            _render();
        }
        
        
        
        
        
        
        
        
        
        protected var _logger:TextArea;
        
        protected function _initLogger():void
        {
            _logger = new TextArea(this, 0, stage.stageHeight - 101, "");
            _logger.width = stage.stageWidth;
            _logger.height = 100;
        }
        
        public function log(msg:String):void
        {
            if(_logger.text != "") msg = msg + "\n";
            _logger.text = msg + _logger.text;
        }
    }
}