- 最后登录
- 2018-12-19
- 注册时间
- 2012-8-20
- 阅读权限
- 90
- 积分
- 54706
- 纳金币
- 32328
- 精华
- 41
|
Sprite3D
如果要使用 Sprite3D ,需要创建两个 swf 文件,一个用来处理 Sprite3D 对象,另一个负责处理场景、摄像机等。
其实 Sprite3D 只是个简单的含有360帧的flash动画而已,每一帧包含一个动作。
这个演示里使用了官方教程提供的一个飞机的360帧的动画。
示意图:
(这里没有用到Sandy,仅仅是个360帧的逐帧动画而已,效果是飞机原地旋转)
剩下的就是关于Sandy相关的知识了
首先是加载外部文件,这里使用的是Sandy的类 Class LoaderQueue
引用:
Package sandy.util
Class public class LoaderQueue
Inheritance LoaderQueue Inheritance flash.events.EventDispatcher
LoaderQueue 有三个方法:
1、LoaderQueue() //创建一个 LoaderQueue 队列;
2、add(p_sID:String, p_oURLRequest:URLRequest, type:String = "IMG"):void // 添加一个新请求到队列(类型支持BIN、IMG、SWF,默认为IMG);
3、start():void //开始加载。
第二个知识点,Sprite3D ()
public function Sprite3D(p_sName:String = "", p_oContent:MovieClip = null, p_nScale:Number = 1, p_nOffset:Number = 0)
作用是创建一个 Sprite3D
参数
p_sName:String (default = "") — 给实例命名
p_oContent:MovieClip (default = null) — 内容
p_nScale:Number (default = 1) — 缩放设置
p_nOffset:Number (default = 0) — 内容的偏移角度,范围是【0-360】
代码:
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.ui.*;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.core.data.*;
import sandy.util.*;
import sandy.events.*;
/**
* ...
* @author ever5u
*/
public class fuxi extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
private var queueoaderQueue;
private var s:Sprite3D;
public function fuxi() {
queue = new LoaderQueue();
queue.add( "plane", new URLRequest("plane.swf"), LoaderQueue.SWF );
queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadComplete );
queue.start();
}
public function loadComplete(eventueueEvent ):void {
//先创建摄像机
camera = new Camera3D( 500, 300 );
camera.y = 10;
camera.z = -300;
//创建 Group
var root:Group = createScene();
//创建一个新 Sprite 用来控制深度,否则飞机会出现在天空的图片之下
var canvas:Sprite = new Sprite();
this.addChild(canvas);
//创建场景
scene = new Scene3D( "scene", canvas, camera, root );
scene.rectClipping = ***e;
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedHandler);
}
private function createScene():Group {
var g:Group = new Group();
s = new Sprite3D("plane", queue.data["plane"], 1);
s.rotateY = 90;
s.x = 0;
s.z = 0;
s.y = 0;
g.addChild(s);
return g;
}
private function enterFrameHandler( event : Event ) : void {
if (s.rotateY==0)
s.rotateY=0.1;
if(s.x > 220 && s.z < 0)
s.x=-220;
else if(s.x < -220 && s.z < 0)
s.x=220;
else if (s.z<-250)
s.z = 1000;
s.moveForward(-7);
scene.render();
}
private function keyPressedHandler(event:KeyboardEvent):void {
if(event.keyCode == Keyboard.RIGHT)
s.rotateY -=5;
if(event.keyCode == Keyboard.LEFT)
s.rotateY +=5;
}
}
}
效果:文件太大了,无法上传,详见附件。 |
|