package { import flash.geom.Vector3D; import alternativa.engine3d.core.Object3D; import alternativa.engine3d.materials.FillMaterial; import alternativa.engine3d.objects.WireFrame; import alternativa.engine3d.primitives.Box; import alternativa.engine3d.primitives.Plane; import org.libspark.alternativa3d.view.AlternativaTemplate; import org.libspark.betweenas3.BetweenAS3; import org.libspark.betweenas3.easing.Bounce; import org.libspark.betweenas3.easing.Cubic; import org.libspark.betweenas3.tweens.ITween; [SWF(frameRate = "60")] public class Main extends AlternativaTemplate { private static const OBJ_NUM:int = 300; // オブジェクトの個数 public var rot:Number = 0; // カメラの円運動用 private var cameraTarget:Vector3D; public function Main() { super({ antiAlias: 2, useDiagram: true }); } override protected function atInit():void { cameraTarget = new Vector3D(); // ベースのトゥイーン生成 var baseTween:ITween; // カメラの動きをTweenで作る baseTween = BetweenAS3.parallel( BetweenAS3.tween(this, { rot: 0 }, { rot: 135 }, 7, Cubic.easeInOut), BetweenAS3.tween(cameraTarget, { z: 400 }, { z: -100 }, 6, Cubic.easeInOut) ); for (var i:int = 0; i < OBJ_NUM; i++) { var cube:Object3D = new Object3D(); // 立方体を作る var box:Box = new Box(100, 100, 100, 1, 1, 1); box.setMaterialToAllSurfaces(new FillMaterial(0x000000, 0.4)); cube.addChild(box); // 塗 var wireBox:WireFrame = WireFrame.createEdges(box, 0xFF0000); cube.addChild(wireBox); // 線 scene.addChild(cube); // ランダムに立方体を配置 cube.x = 8000 * (Math.random() - 0.5); cube.y = 8000 * (Math.random() - 0.5); // 秒数 var sec:Number = 2 * Math.random() + 3; // 立方体の落下する動き baseTween = BetweenAS3.parallel( BetweenAS3.tween(cube, { z: 50 }, { z: 3000 }, sec, Bounce.easeOut), baseTween ); } // お待ちかね! BetweenAS3によるタイムリマップ // [Step.1] まずはTweenを切り出す var tw1:ITween = BetweenAS3.slice(baseTween, 0.0, 0.45, true); // 0%から45%までを切り出し var tw2:ITween = BetweenAS3.slice(baseTween, 0.45, 0.5, true); // 45%から50%までを切り出し var tw3:ITween = BetweenAS3.slice(baseTween, 0.5, 1.0, true); // 50%から100%までを切り出し // [Step.2] Tweenの時間を加工する tw1 = BetweenAS3.scale(tw1, 0.5); // 0.5倍 tw2 = BetweenAS3.scale(tw2, 15); // 15倍 tw3 = BetweenAS3.scale(tw3, 0.5); // 0.5倍 // [Step.3] 切り出したTweenをがちゃんこする var totalTween:ITween = BetweenAS3.serial(tw1, tw2, tw3); // 再生 totalTween.play(); totalTween.stopOnComplete = false; // ループ設定 // 地面 var plane:Plane = new Plane(20000, 20000, 40, 40); var wireEarth:WireFrame = WireFrame.createEdges(plane, 0x888888, 0.4); scene.addChild(wireEarth); } override protected function atPreRender():void { // カメラの回転(BetweenAS3で制御するため) cameraController.setObjectPosXYZ( 1000 * Math.cos(rot * Math.PI / 180), 1000 * Math.sin(rot * Math.PI / 180), cameraTarget.z); cameraController.lookAtXYZ(0, 0, 0); } } }