Dragon-Studio 之 Flash Alternativa 3D引擎 基础教程-3.打造基类

来源:互联网 发布:买淘宝号多少钱 编辑:程序博客网 时间:2024/05/16 18:21

原文:http://www.bcia-bag.com/article/ZMTExMjA=.html

 

*申明:教程中用到的3D引擎Alternativa均以非盈利教学为目的,不得用于任何商业用途。如要购买正版请访问官网网站:http://alternativaplatform.com/en/

 

        我这里已经临晨4点了,不过还是急着写教程。因为平时要上班,所以只能周末更新教程,我希望每次能多写几篇给大家,所以只有熬夜了。

        那我们就秉烛夜谈吧。

        这一章,将正式把理论用于实际,带大家走入A3D,对于没有看前面教程的同学,我强烈建议你能把之前的教程认真看一遍,因为这一章的知识与之前密切相关,而且绝对会帮你进一步理解A3D的机理的。

        上一章讲到,A3D有几个很重要的构成部分,场景(Scene3D),摄像机(Camera3D)与视窗(View)。所以在每一A3D的显示应用中都必须用到这三个对象,并每次都要设置这三个对象的属性。例如,上一章讲到的,必须要向场景中添加摄像机等操作。每次这样的重写代码往往很麻烦,所以我们将为A3D的显示应用创建一个基类,实际的文档类都将继承于这个基类,这样就不必重写代码,同时也体现了AS3语言的封装性与继承派生性。

一. 建立库文件夹

        首先建立一个文件夹,用于存放这个类文件将来我们还会创建许多基于A3D的自定义类文件,创建自己的A3D应用库,也就是现在要建立的文件夹。我们取名为lib。

二.建立基类文件

        在这个文件夹下,建立一个AS3脚本文件,这是一个以.as结尾的脚本文件,可以用Flash生成:

以Flash CS4为例,选择:文件-->新建-->ActionScript文件,并保存在lib文件夹下。文件命名为“AltBasse.as”

三. 编写程序

程序源码如下:

package lib //打包地址要和文件夹地址一样
{
 
//1.导入要用到的类文件

//1.1 导入要用到的A3D类文件
 import alternativa.engine3d.controllers.CameraController;
//摄像机控制器
 import alternativa.engine3d.core.Camera3D; //摄像机对象类
 import alternativa.engine3d.core.Object3D; //三维
 import alternativa.engine3d.core.Scene3D; //场景
 import alternativa.engine3d.display.View; //视窗

 //1.2 导入要用到的Flash类文件
 import flash.display.Sprite;
 import flash.events.Event;

 //建立一个继承自Sprite类的子类,名字要和当前文件名一样
 public class AltBasse extends Sprite
 {
  //建立四个保护类型的属性(因为我们只希望其子类访问这些属性,所以设置成保护类型)
  protected var scene:Scene3D; //场景
  protected var view:View; //视窗 
  protected var camera:Camera3D; //摄像机
  protected var cameraController:CameraController; //摄像机控制器
  
  //构造函数
  public function AltBasse()
  {
   super();
//调用父类的构造函数,即Sprite类的构造函数。
   
   // 建立场景实例
   this.scene = new Scene3D();
   this.scene.root = new Object3D();
//为场景的root属性,即真正意义上的场景,定义成三维显示对象(不明白请参见基础教程第二章)
   
   //建立摄像机
   this.camera = new Camera3D();
   
   //将摄像机加入场景中(为什么?请参见基础教程第二章)
   this.scene.root.addChild(camera);
   
   //建立视窗
   this.view = new View();
   //将视窗加入到当前影片剪辑中(为什么不在场景中?请参见基础教程第二章)
   addChild(this.view);
   //绑定照相机要观察的视窗,也就是说,可以有多个视窗与多个摄像机,但是要制定每个摄像机拍摄那个视窗中的影像,所以要绑定摄像机与对应的视窗。这两者是多对多的关系,简单的应用中,我们用一对一的就可以了。
   this.view.camera = this.camera;
   
   //建立摄像机控制器
   this.cameraController = new CameraController(stage);制定控制器在哪个舞台中
   //定义控制器控制那台摄像机
   this.cameraController.camera = this.camera;
   this.cameraController.setDefaultBindings();
//将控制器的按键设为默认值。由于A3D自带的摄像机控制器是以鼠标和键盘来控制摄像机的,这就要制定鼠标怎样的按键控制摄像机怎样的运动,键盘按什么键,控制什么运动。这条语句就是将这些按键与对应的控制操作设为默认的绑定关系。
   //是否控制摄像机可以检测碰撞,防止摄像机和其他三维对象碰撞
   this.cameraController.checkCollisions = true;
   this.cameraController.collisionRadius = 20; //设置检测碰撞的检测角
   //下面这条约语句话其实可以不要,写到这里是为了告诉大家摄像机控制器要想启动,就必须设置ControlsEnabed属性为true,默认情况下是false,我们这里就设置成默认值。
   this.cameraController.controlsEnabled = false;
   
   //为舞台注册一个事件监听器,用来监听播放器窗口大小发生变化的事件。
   stage.addEventListener(Event.RESIZE,OnResize);
   
   this.OnResize(null);
//调用一次发播放器窗口大小发生变化的事件响化的函数OnResize,这样可以省去对视窗大小的设置。因为在OnResize函数中有这些设置。
  }
  //播放器窗口大小变化的事件响应函数
  protected function OnResize(e:Event):void  //设置成保护类型而不是私有类型,是因为希望在其在派生类中可以重写该响应函数。
  {
   view.width = stage.stageWidth;
//每当窗口变化时,都把视窗设置成与播放器大小一样大。
   view.height = stage.stageHeight;
   scene.calculate(); //
每次变化时,同时对场景中的三维对象进行渲染。就相当于刷新一下场景中的三维对象,因为在改变是视窗是,显示的三维对象可视化属性都会改变。
  }
 }
}

*源文件可以在附件中下载

        到这里,我们就建立好了一个A3D文档类的基类。以后,我们要建立任何一个A3D的文档类,都可以继承这个基类,并且派生出自己的属性。

       可以看到,这个基类的构造用到了许多上一章的知识,所以希望大家能认真的看过前面的章节。现在也许大家还看不到什么可视化的结果。不过在下一章,也就是基础教程的最后一章中,我们会用这个基类建立一些有趣的三维模型。

        说着说着,天都亮了,巴黎的六月还是有点凉。

        我们下次再见。

本文由 站酷网 - baileyange 原创,转载请保留此信息,多谢合作。

原创粉丝点击