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 queue:LoaderQueue; 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(event:QueueEvent ):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 = true; 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; } } }
效果:文件太大了,无法上传,用官方的演示吧
官方地址
出处:蓝色理想
责任编辑:bluehearts
上一页 Flash3D学习——Sandy学习笔记 [9] 下一页 Flash3D学习——Sandy学习笔记 [11]
◎进入论坛RIA设计与应用版块参加讨论
|