package { import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import flash.display.StageAlign; import flash.display.StageScaleMode; public class Velocity3D extends Sprite { private var ball:Ball; //相当于消失点的坐标 private var xpos:Number=0; private var ypos:Number=0; private var zpos:Number=0; //x,y,z三轴上的速度分量 private var vx:Number=0; private var vy:Number=0; private var vz:Number=0; private var friction:Number=0.98; private var fl:Number=250; //消失点 private var vpX:Number=stage.stageWidth/2; private var vpY:Number=stage.stageHeight/2; public function Velocity3D() { init(); } private function init():void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; ball = new Ball(20); addChild(ball); addEventListener(Event.ENTER_FRAME, EnterFrameHandler); stage.addEventListener(KeyboardEvent.KEY_DOWN, KeyDownHandler); } private function EnterFrameHandler(event:Event):void { vpX =stage.stageWidth/2; vpY =stage.stageHeight/2; xpos+=vx; ypos+=vy; zpos+=vz; vx*=friction; vy*=friction; vz*=friction; if (zpos>-fl) { var scale:Number = fl / (fl + zpos); ball.scaleX=ball.scaleY=scale; ball.x=vpX+xpos*scale; ball.y=vpY+ypos*scale; ball.visible=true; } else { ball.visible=false; } //辅助线 graphics.clear(); graphics.lineStyle(1,0xefefef); graphics.moveTo(0,stage.stageHeight/2); graphics.lineTo(stage.stageWidth,stage.stageHeight/2); graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2-8); graphics.moveTo(stage.stageWidth,stage.stageHeight/2); graphics.lineTo(stage.stageWidth-15,stage.stageHeight/2+8); graphics.moveTo(stage.stageWidth/2,0); graphics.lineTo(stage.stageWidth/2,stage.stageHeight); graphics.lineTo(stage.stageWidth/2-8,stage.stageHeight-15); graphics.moveTo(stage.stageWidth/2,stage.stageHeight); graphics.lineTo(stage.stageWidth/2+8,stage.stageHeight-15); graphics.lineStyle(1,0xdadada); graphics.moveTo(vpX,vpY); graphics.lineTo(ball.x,ball.y); } private function KeyDownHandler(e:KeyboardEvent):void { switch (e.keyCode) { case Keyboard.UP : vy-=1; break; case Keyboard.DOWN : vy+=1; break; case Keyboard.LEFT : vx-=1; break; case Keyboard.RIGHT : vx+=1; break; case Keyboard.SHIFT : vz+=0.5; break; case Keyboard.CONTROL : vz-=0.5; break; default : break; } } } }