package { import alternativa.engine3d.core.Object3D; import alternativa.engine3d.materials.*; import alternativa.engine3d.primitives.*; import alternativa.types.*; import flash.display.*; import flash.events.*; import flash.utils.*; import jp.clockmaker.alternativa3d.BasicTemplate; [SWF(width = 720, height = 480, frameRate = 60)] /** * @author Yasu (clockmaker.jp) */ public class Butterfly extends BasicTemplate { // 素材 [Embed(source = 'imgs/alternativa3d_big.png')] private const LOGO_IMAGE:Class; [Embed(source='imgs/butterfly_wind_right.png')] private const WIND_IMAGE_RIGHT:Class; [Embed(source='imgs/butterfly_wind_left.png')] private const WIND_IMAGE_LEFT:Class; /** * 蝶 */ private var butterfly:Object3D; /** * 初期化されたときに実行されるイベントです。 * 初期化時に実行したい処理をオーバーライドして記述します。 */ override protected function atInit():void { stage.quality = StageQuality.MEDIUM; graphics.beginFill(0x001122); graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); // オブジェクトを作成します butterfly = createButterfly(); var earth:Plane = new Plane(1000, 1000, 10, 10, false); earth.cloneMaterialToAllSurfaces(new WireMaterial(1, 0xFFFFFF, .5)); // 3D表示リストに追加します scene.root.addChild(butterfly); scene.root.addChild(earth); addChild(new LOGO_IMAGE); } /** * Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。 * レンダリング前に実行したい処理をオーバーライドして記述します。 */ override protected function atPreRender():void { // 蝶の揺らぎを設定しています butterfly.z = Math.sin(getTimer() / 200) * -25 + 240; // カメラが演習を回っているように設定しています camera.x = 500 * Math.sin(getTimer() / 1000); camera.y = 500 * Math.cos(getTimer() / 1000); var targetZ:Number = 400 * (mouseY / stage.stageHeight) + 300 camera.z += (targetZ - camera.z) * 0.1; // カメラが近づいたり離れたりする演出 camera.zoom = 10 * Math.sin(getTimer() / 2000) + 40; cameraContoller.lookAt(new Point3D()); } /** * 蝶を作成します * @return 蝶(DisplayObject3D型) */ private function createButterfly():Object3D { // 蝶のコンテナーを作成 var butterfly :Object3D = new Object3D(); // 蝶の羽を作成 var leftWing :Object3D = new Object3D(); var rightWing :Object3D = new Object3D(); // 蝶の羽の素材を作成 var texRight:Texture = new Texture((new WIND_IMAGE_RIGHT).bitmapData); var texLeft:Texture = new Texture((new WIND_IMAGE_LEFT).bitmapData); var matRight:TextureMaterial = new TextureMaterial(texRight); matRight.precision = TextureMaterialPrecision.VERY_LOW; var matLeft:TextureMaterial = new TextureMaterial(texLeft); matLeft.precision = TextureMaterialPrecision.VERY_LOW; // 蝶の羽を貼り付ける平面を作成 var leftWingPlane :Plane = new Plane(200, 200, 1, 1); leftWingPlane.cloneMaterialToAllSurfaces(matLeft); var rightWingPlane :Plane = new Plane(200, 200, 1, 1); rightWingPlane.cloneMaterialToAllSurfaces(matRight); // 蝶の羽平面の座標や角度を調整 leftWingPlane.x = -100; rightWingPlane.x = 100; // 蝶の羽をコンテナーの表示リストに追加 leftWing.addChild(leftWingPlane); rightWing.addChild(rightWingPlane); butterfly.addChild(leftWing); butterfly.addChild(rightWing); // アニメーションの設定 addEventListener(Event.ENTER_FRAME, function(event:Event):void { // 羽が羽ばたく演出 leftWing.rotationY = (Math.sin(getTimer() / 200) * 40) * Math.PI / 180; rightWing.rotationY = (Math.sin(getTimer() / 200) * -40) * Math.PI / 180; }); // 蝶のインスタンスを返却 return butterfly; } } }