6 BasicView到底是什么东东

BasicView到底是什么东东?

准备知识

ü        类

ü        继承

ü        重写(override)

在PV3D中有四大核心类,要在Flash中显示3D物体,就要使用这四个类。也就是说你要在每个项目中重复的定义这四个类。嗯,有人觉得没什么,多敲几行代码罢了。有人觉得这简直不能容忍。我是属于后面这种的。

有什么办法结束这种重复的定义工作呢?有的,那就是BasicView。下面我们来看看BasicView的类图,具体实现代码可参看PV3D源代码。


在类图中,我们仅仅将我们感兴趣的属性和方法标出。从图可知,BasicView是一个Sprite,而且从AbstractView类中继承了四大核心类。那么startRendering方法和onRenderTick方法是什么呢?

为了理解BasicView类,我们决定自己编写一个简单MyBasicView类,它继承Sprite类,拥有四个核心类变量,以及startRendering方法和onRenderTick方法。这样我们就能基本了解BasicView类的执行原理。

在src文件夹中创建MyBasicView类,代码见代码清单1。

代码清单1

package 

{

       import flash.display.Sprite;

       import org.papervision3d.cameras.Camera3D;

       import org.papervision3d.render.BasicRenderEngine;

       import org.papervision3d.scenes.Scene3D;

       import org.papervision3d.view.Viewport3D;

      

       import flash.events.Event;

       /**

        * ...

        * @author yl

        */

       public class MyBasicView extends Sprite

       {

              //定义四大核心类

              protected var scene:Scene3D;

              protected var viewport:Viewport3D;

              protected var camera:Camera3D;

              protected var render:BasicRenderEngine;

             

              public function MyBasicView()

              {

                     //构造方法中初始化四大核心类

                     scene= new Scene3D();

                     viewport= new Viewport3D();

                     camera= new Camera3D();

                     render= new BasicRenderEngine();

                     //将窗口加载进MyBasicView对象

                     addChild(viewport);

              }

             

              public function startRendering():void {

                     //添加刷屏方法onRenderTick

                     addEventListener(Event.ENTER_FRAME,onRenderTick);

              }

             

              protected function onRenderTick(event:Event):void {

                     //不断的将场景渲染到窗口

                     render.renderScene(scene,camera, viewport);

              }

       }

}

现在,我们修改Main类,代码如代码清单2所示。

代码清单2

package

{

       import flash.display.Sprite;

       import flash.events.Event;

       import org.papervision3d.cameras.Camera3D;

       import org.papervision3d.materials.WireframeMaterial;

       import org.papervision3d.objects.primitives.Sphere;

       import org.papervision3d.render.BasicRenderEngine;

       import org.papervision3d.scenes.Scene3D;

       import org.papervision3d.view.Viewport3D;

      

       importflash.display.StageAlign;

       importflash.display.StageScaleMode;

       /**

        * ...

        * @author yl

        */

       [SWF(width="640",height="480",backgroundColor="#FFFFFF")]

       public class Main extends MyBasicView

       {

              private var sphere:Sphere//定义一个球体

 

              public function Main():void

              {

                     if(stage) init();

                     else addEventListener(Event.ADDED_TO_STAGE, init);

              }

             

              private function init(e:Event = null):void

              {

                     removeEventListener(Event.ADDED_TO_STAGE,init);

                     //entry point

                     stage.scaleMode= StageScaleMode.NO_SCALE;

                     stage.align= StageAlign.TOP_LEFT;

                    

                     sphere= new Sphere(null, 320, 12, 8);

                     sphere.z= -100;

                     //将生成的球体加载进场景,以便摄像机能拍摄到

                     scene.addChild(sphere);//这里使用了继承来的变量

                     startRendering();//使用继承来的方法

              }

              override protected function onRenderTick(event:Event):void {//由于继承来的方法不适合我们要求,我们重写方法

                     super.onRenderTick(event);//调用MyBasicView类中的onRenderTick方法

                     sphere.rotationY+= 3;

              }

       }

}

测试运行,出来球体旋转效果。但是和直接在Main类中定义四大核心类相比,代码减少了很多,最重要的是MyBasicView类可以在所有的项目中使用。这样,我们达到了代码重用的效果。

理解了MyBasicView类,那么就很容易理解BasicView类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值