スポンサーサイト

-------- | --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[ActionScript 3.0] 自力で3D(カメラ移動)

2007-08-12 | 23:07

前回作成したバージョンにカメラの移動機能を追加。
(ウィンドウをクリックしてフォーカスを移した後、上下左右キーでカメラが移動)

package{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.ui.*;
    import flash.utils.*;
    [SWF(width="400", height="300",backgroundColor="0xffffff")]

        public class ThreeD2 extends Sprite{
            private var x1:Number = 0 ;
            private var z1:Number = 200;

            private var vx:Number = 2;

            private var cameraX:Number = 0;
            private var cameraY:Number = 50;
            private var cameraZ:Number = 0;

            private var faceZ:Number = 100;

            private static var HEIGHT:Number =200;
            private static var WIDTH:Number =150;

            public function ThreeD2(){
                addEventListener(Event.ENTER_FRAME, loop);
                stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
                x1 = 100;
            }

            private function onKeyDown(e:KeyboardEvent):void{
                trace(e.keyCode);
                switch(e.keyCode){
                    case Keyboard.UP:
                        cameraZ++;
                        faceZ++;
                        break;
                    case Keyboard.DOWN:
                        cameraZ--;
                        faceZ--;
                        break;
                    case Keyboard.LEFT:
                        cameraX--;
                        break;
                    case Keyboard.RIGHT:
                        cameraX++
                            break;
                }
                trace(cameraZ);
            }

            private function loop(e:Event):void{
                graphics.clear();

                var vertex:Array = new Array();
                vertex[0] = calcPoint(x1, HEIGHT, z1);
                vertex[1] = calcPoint(x1+WIDTH, HEIGHT, z1);
                vertex[2] = calcPoint(x1+WIDTH, HEIGHT, z1+WIDTH);
                vertex[3] = calcPoint(x1, HEIGHT, z1+WIDTH);
                vertex[4] = calcPoint(x1, 0, z1);
                vertex[5] = calcPoint(x1+WIDTH, 0, z1);
                vertex[6] = calcPoint(x1+WIDTH, 0, z1+WIDTH);
                vertex[7] = calcPoint(x1, 0, z1+WIDTH);

                graphics.beginFill(0x0000ff,0.8);
                graphics.drawRect(vertex[0].x, vertex[0].y, 
                        vertex[1].x - vertex[0].x, vertex[4].y - vertex[0].y);
                graphics.endFill();

                var seq:Array = [1,2,3,0,4,5,6,7,4,5,1,2,6,7,3]
                graphics.lineStyle(4, 0xff, 0.5);
                graphics.moveTo(vertex[0].x, vertex[0].y);
                for each(var ix:int in seq)
                    graphics.lineTo(vertex[ix].x, vertex[ix].y);

            }

            private function calcPoint(x:Number, y:Number, z:Number):Point{
                return new Point((faceZ - cameraZ) * (x - cameraX) / (z - cameraZ)+ 200,
                        200 - (faceZ - cameraZ) * (y - cameraY) / (z - cameraZ));
            }
        }
}
スポンサーサイト

Comment

Post a comment

Secret

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。