package { import flash.display.Sprite; import flash.events.Event; import flash.display.StageAlign; import flash.display.StageScaleMode; public class Bounce3D extends Sprite { private var ball:Ball; private var xpos:Number=0; private var ypos:Number=0; private var zpos:Number=0; private var vx:Number=Math.random()*12-6; private var vy:Number=Math.random()*12-6; private var vz:Number=Math.random()*12-6; private var fl:Number=250; //消失点 private var vpX:Number=stage.stageWidth/2; private var vpY:Number=stage.stageHeight/2; //相对于消失点的六个边界面(上,下,左,右,前,后) private var top:Number=-100; private var bottom:Number=100; private var left:Number=-100; private var right:Number=100; private var front:Number=100; private var back:Number=-100; public function Bounce3D() { init(); } private function init():void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; ball=new Ball(15); addChild(ball); addEventListener(Event.ENTER_FRAME, EnterFrameHandler); } private function EnterFrameHandler(event:Event):void { vpX =stage.stageWidth/2; vpY =stage.stageHeight/2; xpos+=vx; ypos+=vy; zpos+=vz; var radius:Number=ball.radius; //左右边界 if (xpos+radius>right) { xpos=right-radius; vx*=-1; } else if (xpos - radius < left) { xpos=left+radius; vx*=-1; } //上下边界 if (ypos+radius>bottom) { ypos=bottom-radius; vy*=-1; } else if (ypos - radius < top) { ypos=top+radius; vy*=-1; } //前后边界 if (zpos+radius>front) { zpos=front-radius; vz*=-1; } else if (zpos - radius < back) { zpos=back+radius; vz*=-1; } //换算成平面二维坐标及缩放比率 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,0xccccff); 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(0,stage.stageHeight); graphics.lineTo(stage.stageWidth,0); graphics.lineTo(stage.stageWidth-15,2); graphics.moveTo(stage.stageWidth,0); graphics.lineTo(stage.stageWidth-6,13); 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,0xffccff); graphics.moveTo(vpX,vpY); graphics.lineTo(ball.x,ball.y); } } }