package { import alternativa.engine3d.controllers.*; import alternativa.engine3d.core.*; import alternativa.engine3d.display.*; import alternativa.engine3d.materials.*; import alternativa.engine3d.primitives.*; import alternativa.types.*; import alternativa.utils.*; import flash.net.*; import flash.display.*; import flash.events.*; import flash.geom.*; import flash.utils.getTimer; [SWF(width="720", height="480", frameRate="60")] public class Main extends Sprite { // Const Vars static private const ROT_NUM :uint = 5; static private const CHILDREN_NUM :uint = 10; private var higes:Array = []; private var scene:Scene3D; private var view:View; private var camera:Camera3D; // The camera controller private var controller:CameraController; [Embed(source = "alternativa3d_big.png")] private var Logo:Class; public function Main() { stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.MEDIUM; // Creating scene scene = new Scene3D(); scene.root = new Object3D(); // create 3d objects for (var i:int = 0; i < ROT_NUM; i++) { var hige:Object3D = new Object3D(); scene.root.addChild(hige); hige.rotationY = i * 360 / ROT_NUM * Math.PI / 180; var distance:Number = 100; for (var j:int = 0; j < CHILDREN_NUM; j++) { var box:Sphere = Sphere(hige.addChild(new Sphere(50, 3, 2))); box.cloneMaterialToAllSurfaces(new DevMaterial(0, 0xFF0000 + 0x001000 * j)); box.scaleX = box.scaleY = box.scaleZ = 1 - 1 / CHILDREN_NUM * j; distance += 100 * box.scaleX; box.z = distance; hige.addChild(box); if (higes[j] == null) higes[j] = []; higes[j][i] = box } } // Adding camera camera = new Camera3D(); scene.root.addChild(camera); // set camera controller controller = new CameraController(stage); controller.camera = camera; controller.checkCollisions = false; controller.controlsEnabled = false; // set view view = new View(); addChild(view); view.camera = camera; // FPS display launch FPS.init(stage); createLogo(); stage.addEventListener(Event.RESIZE, onResize); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); onResize(null); // mouse interactive stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onEnterFrame(e:Event):void { // Hige Animation for (var j:int = 0; j < higes.length; j++) { for (var i:int = 0; i < higes[j].length; i++) { var rot:Number = getTimer() / 1000 + 100 * i; higes[j][i].x = Math.sin(rot) * 30 * j higes[j][i].y = Math.cos(rot) * 10 * j } } // Mouse Interactive easePitch += (cameraPitch - easePitch) * 0.2 easeYaw += (cameraYaw - easeYaw) * 0.2 camera.x = 500 * Math.sin(easeYaw * Math.PI / 180); camera.y = 500 * Math.cos(easeYaw * Math.PI / 180); //camera.rotationY = -cameraPitch camera.z += (500 * Math.cos(cameraPitch * Math.PI / 180) - camera.z )* .1; controller.lookAt(new Point3D(0, 0, 0)); // Scene calculating scene.calculate(); } /** * Resize Handler */ private function onResize(e:Event):void { view.width = stage.stageWidth; view.height = stage.stageHeight; // BackGround Color var bgMatrix:Matrix = new Matrix(); bgMatrix.rotate(90 * Math.PI / 180); graphics.clear() graphics.beginGradientFill("linear", [0xFFFFFF, 0x001122], [100, 100], [0, 255], bgMatrix); graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); } /** * Create Clickable Logo */ private function createLogo():void { var sp:Sprite = Sprite(addChild(new Sprite())); sp.addChild(new Logo()) sp.buttonMode = true; sp.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void { navigateToURL( new URLRequest("http://alternativaplatform.com/en/"), "_blank"); }) } // ---------------------------------------------- // Mouse Interactive // ---------------------------------------------- private var isOribiting:Boolean; private var cameraPitch:Number = 90; private var cameraYaw:Number = 270; private var previousMouseX:Number; private var previousMouseY:Number; private var easePitch:Number = 90; private var easeYaw:Number = 270; private function onMouseDown(event:MouseEvent):void { isOribiting = true; previousMouseX = event.stageX; previousMouseY = event.stageY; } private function onMouseUp(event:MouseEvent):void { isOribiting = false; } private function onMouseMove(event:MouseEvent):void { var differenceX:Number = event.stageX - previousMouseX; var differenceY:Number = event.stageY - previousMouseY; if(isOribiting) { cameraPitch += differenceY * 0.25; cameraYaw += differenceX * 0.25; cameraPitch %= 360; cameraPitch = cameraPitch > 0 ? cameraPitch : 0.0001; cameraPitch = cameraPitch < 180 ? cameraPitch : 179.9999; previousMouseX = event.stageX; previousMouseY = event.stageY; } } } }