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类。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |