http://www.flashsandy.org/

from_ greenass hansune
As 3.0
3D engine :: sandy



작업에 쓰인 건데 살짝 정리안한 코드 . 세상엔 착하고 대단한 넘들이 많다.


import flash.events.*;
import flash.ui.*;
import sandy.core.Scene3D;
import sandy.core.data.*;
import sandy.core.scenegraph.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
import sandy.primitive.*;
import sandy.util.*;
import sandy.events.*;

private var scene:Scene3D;
private var camera:Camera3D;
private var queue:LoaderQueue;
private var g:Group;

private var tgRad:Array = new Array();
private var rad:Array = new Array();

public function navi3D():void {
   queue = new LoaderQueue();
   queue.add( "p0", new URLRequest("data/poster_0.jpg") );
   queue.add( "p1", new URLRequest("data/poster_1.jpg") );
   queue.add( "p2", new URLRequest("data/poster_2.jpg") );
   queue.add( "p3", new URLRequest("data/poster_3.jpg") );
   queue.add( "p4", new URLRequest("data/poster_4.jpg") );
   queue.add( "p5", new URLRequest("data/poster_5.jpg") );
   queue.add( "p6", new URLRequest("data/poster_6.jpg") );
   queue.add( "p7", new URLRequest("data/poster_7.jpg") );
   queue.addEventListener(SandyEvent.QUEUE_COMPLETE, loadComplete );
   queue.start();
  }
  public function loadComplete(event:QueueEvent):void {
   // We create the camera
   camera = new Camera3D( 1360, 768 );
   camera.x = 0;
   camera.y = 0;
   camera.z = 0;
   camera.near = 140;

   // We create the "group" that is the tree of all the visible objects
   var root3D:Group = createScene();

   // We create a Scene and we add the camera and the objects tree
   scene = new Scene3D( "scene", mStage, camera, root3D );
   scene.rectClipping = false;
   camera.moveForward(-1310);
   // Listen to the heart beat and render the scene :: 프레임 렌더링
   this.addEventListener( Event.ENTER_FRAME, enterFrameHandler );
    // 키 이벤트
   stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedHandler);
    // 이미지 모션
   mStage.addEventListener(Event.ENTER_FRAME,posterMove);
   //카메라 핸들
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMovedHandler);

  }
  // Create the scene graph based on the root Group of the scene
  private function createScene():Group {
   // Create the root Group
   g = new Group();

   // let's create the Sprite 2D object
   for (var i:Number=0; i<listNum; i++) {
    var bit:Bitmap = new Bitmap(queue.data["p"+i].bitmapData);
    var s:Sprite2D = new Sprite2D("poster"+i,bit,1);
    s.x = 0;
    s.z = 0;
    s.y = 0;
    //s.scaleX = 0;
    tgRad[i] = rotateSpan*i-90;
    rad[i] = 90;

    g.addChild(s);
   }
   return g;
  }
  private function posterMove(e:Event):void {

   for (var i:int = 0; i < listNum; ++i) {

    rad[i] += (tgRad[i] - rad[i])*0.02;

    var s:Sprite2D = Sprite2D(g.getChildByName("poster"+i));
    s.x = Math.cos(rad[i]*Math.PI/180)*400;
    s.z = Math.sin(rad[i]*Math.PI/180)*400;

    var n:int;
    n = i - 2;
    if(n<0){n=n+listNum;}
   
    if (tgRad[i]%360 == 0) {
     focusedMovie = i;
     posterBox(nStage.getChildAt(n)).alpha += (1 - posterBox(nStage.getChildAt(n)).alpha)*0.02;
   
    } else {
     posterBox(nStage.getChildAt(n)).alpha += (0 - posterBox(nStage.getChildAt(n)).alpha)*0.06;
    }
   }
  }
  // The Event.ENTER_FRAME event handler tells the Scene3D to render
  private function enterFrameHandler( event : Event ):void {
   /* 자식들 위치 조정
    for (var j:Number=0; j<listNum; j++)
        {
    if(g.children[j].z<camera.z-120 )
     {
    g.children[j].z+=1200;
     }
    }*/
   scene.render();
  }
  // This function handles the move foreward or backward simultaion
  private function keyPressedHandler(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case Keyboard.UP :
     camera.moveForward(5);
     break;
    case Keyboard.DOWN :
     camera.moveForward(-5);
     break;
   }
  }
  // This function handles the direction of the similation movement
  private function mouseMovedHandler(event:MouseEvent):void {
   camera.pan=(event.stageX-300/2)/10;
  }


  ////////////////////////
this.addEventListener(Event.ENTER_FRAME,btView);

private function btView(e:Event):void {
   ok.alpha += 0.02;
   ijun.alpha += 0.02;
   daum.alpha += 0.02;

   ok.y += (okPoint.y - ok.y)*0.02;
   ijun.x += (ijunPoint.x - ijun.x)*0.02;
   daum.x += (daumPoint.x - daum.x)*0.02;

   if (ok.alpha > 0.8) {
    this.removeEventListener(Event.ENTER_FRAME,btView);
    ok.y = okPoint.y;
    ijun.x = ijunPoint.x;
    daum.x = daumPoint.x;
    ok.alpha = 0.5;
    ijun.alpha = 0.5;
    daum.alpha = 0.5;

    addEvent();//버튼 액션
   }
  }
  private function addEvent():void {
   ok.addEventListener(Event.ENTER_FRAME,okClick);
   ijun.addEventListener(Event.ENTER_FRAME,ijunClick);
   daum.addEventListener(Event.ENTER_FRAME,daumClick);
  }
  private function removeEvent():void {
   ok.removeEventListener(Event.ENTER_FRAME,okClick);
   ijun.removeEventListener(Event.ENTER_FRAME,ijunClick);
   daum.removeEventListener(Event.ENTER_FRAME,daumClick);
  }


  private function okClick(e:Event):void {
   if (ok.hitTestPoint(mouseX,mouseY,false)) {
    ok.alpha = 1.0;
   
    if (focusedMovie == 2) {
     removeEvent();
     trace("영화정보 보기");
     mStage.removeEventListener(Event.ENTER_FRAME,posterMove);
    scene.dispose();//중요//씬 메모리 지우기
     this.play();

    }
   } else {
    ok.alpha += (0.5 - ok.alpha)*0.05;
   }
  }
  private function daumClick(e:Event):void {
   if (daum.hitTestPoint(mouseX,mouseY,false)) {
    daum.alpha = 1.0;
    removeEvent();
    for (var i:int = 0; i<listNum; ++i) {
     tgRad[i] += rotateSpan;

    }
    var revitalBt:Number = setTimeout(addEvent,1000);
   
   } else {
    daum.alpha += (0.5 - daum.alpha)*0.05;
   }
  }
  private function ijunClick(e:Event):void {
   if (ijun.hitTestPoint(mouseX,mouseY,false)) {
    ijun.alpha = 1.0;
    removeEvent();
    for (var i:int = 0; i<listNum; ++i) {
     tgRad[i] -= rotateSpan;
    }
    var revitalBt:Number = setTimeout(addEvent,1000);
   } else {
    ijun.alpha += (0.5 - ijun.alpha)*0.05;
   }
  }