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类。