您的位置:首页 > 其它

6 BasicView到底是什么东东

2012-02-16 22:39 501 查看

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类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: