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类。
相关文章推荐
- Android的Activity中setContentView到底经历了什么?
- 工作经验到底是个什么东东?工作经验从哪里来?
- Linux内存中的 buffer 和 cache 到底是个什么东东?
- EJB到底是什么东东
- (转)工作经验到底是个什么东东?工作经验从哪里来?
- 大家有没有考虑过这个问题:datagrid分页,viewstate到底起什么作用?
- Linux内存中的 buffer 和 cache 到底是个什么东东?
- 【转】工作经验到底是个什么东东?工作经验从哪里来?
- latte到底是个什么东东?
- TrackViewState到底是干什么的
- 工作经验到底是个什么东东?工作经验从哪里来? 【转】
- (源码阅读)我们经常用的setContentView(),到底做了什么。
- 工作经验到底是个什么东东?工作经验从哪里来?
- Activity中的setContentView方法到底做了什么?
- 【Android开发经验】ViewHolder到底用什么修饰?static?final?static final?
- 工作经验到底是个什么东东?工作经验从哪里来?
- 软件测试,你到底是个什么东东?
- 程序员鼓励师到底是个什么东东,猿猿们真的需要吗?
- android - ViewHolder到底用什么修饰?static?final?static final?
- 工作经验到底是个什么东东?工作经验从哪里来?