English Sentence Loading...
英语句子加载中...
预览模式: 普通 | 列表

A3D 开发的FPS游戏

http://www.gamezhero.com/online-games/action-games/captainzorrolasthope-games.html


最多类似上个世纪的早期FPS游戏《毁灭公爵》,强烈呼唤adobe能让fp和gpu建立亲密关系啊。

A3D 的一个小游戏。



a3d 的一个游戏。

A3D更新为5.4.0

这次更新也一并更改了版本号的规则。

- Added View getFaceUnderPoint and getFacesUnderPoint methods, which let to get faces under set point
- Added WalkController and FlyController classes, which let to manage walk and fly modes
- Added EllipsoidCollider class, which implements ellipsoid-to-geometry collision detection
- Added Scene3D planeOffsetThreshold parameter — an offset for defining distances between point and splitter planes
- Added Set.createFromArray method, which creates set from array
- Added Matrix3D.axisAngleToMatrix method, which forms rotation matrix from axis-angle representation
- Added Matrix3D getRotations method, which gets rotation angles values
- Bug fixed in OBJLoader, which showed up during uploading model with textures but without UV-mapping
- Bug fixed in Mesh cloning, which showed up if surface has no material

增加了几个新的方法和类,如WalkController和FlyController类,对漫游方式的飞行和行走选择提供了支持。也修正了几个bug..

A3D 更新为5.03

此版本会有两个版本的alternativa3d ,FP9和FP10.

更新内容:

  • 增加了obj模型的读取支持
  • setmaterialtoallsurfaces方法更名为clonematerialtoallsurfaces
  • Loader3DS增加了关闭方法,手动地中断上载
  • 纹理参数作为只读
  • 错误修正- 在更新了UV-coordinates 后,没有进行重绘
  • 补充和修正了不正确的UV纹理贴图
  • 优化碰撞检测
  • 文档更新

  • http://help.alternativaplatform.com/en/client/alternativa3d_help.zip  这个是api的doc下载地址.

    alternativa3d更新为5.0.1

    试玩 Text 3D 文字

    用到的 Five3D 类,一个简单的测试效果。



    点击舞台会有字体变化

    发现一张很有意思的图



    哈哈,看出什么来了吗? A3D VS PV3D
    这一记飞腿是BSP?还是automatic UV?拭目以待吧。
    至少在目前的5.0API上还看不到有力的绝招。

    关于A3D目前的版本功能

    目前提供的5.0API还没有物体碰撞功能,暂时只有相机的碰撞。
    灯光和鼠标控制事件暂时也没有提供,我想下个版本应该会有这些基本的功能。
    也就是说,现在的版本还只适合做漫游,或是类CS的东西。

    貌似alternativa.engine3d.physics下面有物理碰撞的类。得有空的时候来摸了。

    A3D 3 加载3DS模型

    加载3ds文件.依然转成中文,因为用网站翻译,所以可能不太准确.主要注释在加载3d文件部分.

    1. package cn.com.xy50{
    2.  import alternativa.engine3d.controllers.CameraController;
    3.  import alternativa.engine3d.core.Camera3D;
    4.  import alternativa.engine3d.core.Mesh;
    5.  import alternativa.engine3d.core.Object3D;
    6.  import alternativa.engine3d.core.Scene3D;
    7.  import alternativa.engine3d.display.View;
    8.  import alternativa.engine3d.loaders.Loader3DS;
    9.  import alternativa.engine3d.materials.TextureMaterialPrecision;
    10.  import alternativa.utils.FPS;
    11.  import alternativa.utils.MeshUtils;
    12.  
    13.  import flash.display.Sprite;
    14.  import flash.display.StageAlign;
    15.  import flash.display.StageScaleMode;
    16.  import flash.events.Event;
    17.  
    18.  [SWF(backgroundColor="#000000", frameRate="100")]
    19.  
    20.  public class Test3 extends Sprite {
    21.  
    22.  private var scene:Scene3D;
    23.  private var view:View;
    24.  private var camera:Camera3D;
    25.  private var cameraController:CameraController;
    26.  private var loader:Loader3DS;
    27.  
    28.  /**
    29. *
    30. */
    31.  public function Test3() {
    32.  stage.scaleMode = StageScaleMode.NO_SCALE;
    33.  stage.align = StageAlign.TOP_LEFT;
    34.  
    35.  startLoading();
    36.  initScene();
    37.  initListeners();
    38.  
    39.  onResize(null);
    40.  }
    41.  
    42.  /**
    43. * Создание сцены и камеры.
    44. */
    45.  private function initScene():void {
    46.  scene = new Scene3D();
    47.  scene.root = new Object3D();
    48.  camera = new Camera3D();
    49.  camera.x = 0;
    50.  camera.y = -400;
    51.  camera.z = 0;
    52.  scene.root.addChild(camera);
    53.  view = new View();
    54.  addChild(view);
    55.  view.camera = camera;
    56.  
    57.  cameraController = new CameraController(stage);
    58.  cameraController.camera = camera;
    59.  cameraController.setDefaultBindings();
    60.  cameraController.checkCollisions = true;
    61.  cameraController.collisionRadius = 20;
    62.  cameraController.controlsEnabled = true;
    63.  cameraController.speed = 500;
    64.  
    65.  
    66.  FPS.init(stage);
    67.  }
    68.  
    69.  /**
    70. *
    71. */
    72.  private function onResize(e:Event):void {
    73.  view.width = stage.stageWidth;
    74.  view.height = stage.stageHeight;
    75.  }
    76.  
    77.  /**
    78. *
    79. */
    80.  private function onEnterFrame(e:Event):void {
    81.  cameraController.processInput();
    82.  scene.calculate();
    83.  }
    84.  
    85.  /**
    86. *
    87. */
    88.  private function initListeners():void {
    89.  stage.addEventListener(Event.RESIZE, onResize);
    90.  stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    91.  }
    92.  
    93.  /**
    94. * 加载 3DS 格式的三维模型.
    95. */
    96.  private function startLoading():void {
    97.  loader = new Loader3DS(); // 3ds 加载类,继承自 EventDispatcher
    98.  loader.smooth = true; // 材质的平滑模式
    99.  loader.precision = TextureMaterialPrecision.HIGH; // 透视精确度,这里设置为高,可选值"BEST,HIGH,LOW,MEDIUM,NONE,VERY_HIGH,VERY_LOW"
    100.  loader.load("assets/me/djwolf.3ds"); // 加载模型
    101.  loader.addEventListener(Event.COMPLETE, onLoadingComplete); // 监听加载事件
    102.  }
    103.  
    104.  /**
    105. *
    106. */
    107.  private function onLoadingComplete(e:Event):void {
    108.  for (var o:* in loader.content.children) {
    109.  var object:Object3D = o;
    110.  cameraController.lookAt(object.coords);
    111.  weldVerticesAndFaces(object);
    112.  scene.root.addChild(object);
    113.  }
    114.  }
    115.  
    116.  /**
    117. * Объединение вершин и граней объекта.
    118. */
    119.  private function weldVerticesAndFaces(object:Object3D):void {
    120.  if (object is Mesh) {
    121.  MeshUtils.autoWeldVertices(Mesh(object), 0.01); // 连接网格物体的顶点有相同的坐标。
    122.  MeshUtils.autoWeldFaces(Mesh(object), 0.01, 0.001);
    123.  }
    124.  // Запуск процедуры для детей объекта
    125.  for (var key:* in object.children) {
    126.  weldVerticesAndFaces(key);
    127.  }
    128.  }
    129.  }
    130.  }




    http://boxstr.com/files/2287538_lhiur/tt.rar
    此连接包含code和3ds文件,建议编译环境Flex+FDT。

    A3D 2 -- 坐标系统

    A3D 的坐标系统和以前我所接触过的坐标方向有所区别,正负还是通过"右手法则"可以判断,但是3轴方向如图:


    ---------------------------------- fgx ------------------------------------

    1. package cn.com.xy50 {
    2.  import alternativa.engine3d.controllers.CameraController;
    3.  import alternativa.engine3d.core.Camera3D;
    4.  import alternativa.engine3d.core.Object3D;
    5.  import alternativa.engine3d.core.Scene3D;
    6.  import alternativa.engine3d.display.View;
    7.  import alternativa.engine3d.materials.FillMaterial;
    8.  import alternativa.engine3d.primitives.*;
    9.  import alternativa.utils.FPS;
    10.  
    11.  import flash.display.Sprite;
    12.  import flash.display.StageAlign;
    13.  import flash.display.StageScaleMode;
    14.  import flash.events.Event;
    15.  
    16.  public class Test1 extends Sprite {
    17.  
    18.  private var scene:Scene3D;
    19.  private var view:View;
    20.  private var camera:Camera3D;
    21.  private var cameraController:CameraController;
    22.  private var boxX:Box;
    23.  private var boxY:Box;
    24.  private var boxZ:Cone;
    25.  private var speed:Number=.1;
    26.  
    27.  public function Test1() {
    28.  stage.scaleMode = StageScaleMode.NO_SCALE;
    29.  stage.align = StageAlign.TOP_LEFT;
    30.  createScene();
    31.  }
    32.  
    33.  private function createScene():void
    34.  {
    35.  // 创造一个场景
    36.  scene = new Scene3D();
    37.  scene.root = new Object3D();
    38.  
    39.  boxX = new Box(100, 100, 100, 3, 3, 3);
    40.  boxX.setMaterialToAllSurfaces(new FillMaterial(0xFF0000));
    41.  scene.root.addChild(boxX);
    42.  boxX.x=-200;
    43.  
    44.  boxY = new Box(100, 100, 100, 3, 3, 3);
    45.  boxY.setMaterialToAllSurfaces(new FillMaterial(0x00FF00));
    46.  scene.root.addChild(boxY);
    47.  boxY.x=0;
    48.  
    49.  boxZ = new Cone(100, 100, 3, 3, 3);
    50.  boxZ.setMaterialToAllSurfaces(new FillMaterial(0x0000FF));
    51.  scene.root.addChild(boxZ);
    52.  boxZ.x=200;
    53.  
    54.  
    55.  // 加入相机
    56.  camera = new Camera3D();
    57.  camera.x = 0;
    58.  camera.y = -500;
    59.  camera.z = 100;
    60.  scene.root.addChild(camera);
    61.  
    62.  view = new View();
    63.  addChild(view);
    64.  view.camera = camera;
    65.  
    66.  // 相机控制
    67.  cameraController = new CameraController(stage);
    68.  cameraController.camera = camera;
    69.  cameraController.setDefaultBindings();
    70.  cameraController.checkCollisions = true;
    71.  cameraController.collisionRadius = 20;
    72.  cameraController.lookAt(boxY.coords);
    73.  cameraController.controlsEnabled = true;
    74.  
    75.  // 显示FPS
    76.  FPS.init(stage);
    77.  
    78.  stage.addEventListener(Event.RESIZE, onResize);
    79.  stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
    80.  onResize(null);
    81.  }
    82.  
    83.  private function onResize(e:Event):void {
    84.  view.width = stage.stageWidth;
    85.  view.height = stage.stageHeight;
    86.  }
    87.  
    88.  private function onEnterFrame(e:Event):void {
    89.  boxX.rotationX+=speed;
    90.  boxY.rotationY+=speed;
    91.  boxZ.rotationZ+=speed;
    92.  // 处理用户输入
    93.  cameraController.processInput();
    94.  // 计算渲染场景
    95.  scene.calculate();
    96.  }
    97.  }
    98.  }


    这是一个更加清晰显示坐标系统的例子.