package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.ui.Mouse; import flash.ui.MouseCursor; import flash.geom.Rectangle; public class AngleBounce extends Sprite { private var ball:Ball; private var line:Sprite; private var gravity:Number=0.25; private var bounce:Number=-0.6; private var rect:Rectangle; public function AngleBounce() { init(); } private function init():void { Mouse.cursor=MouseCursor.BUTTON; ball=new Ball(10); addChild(ball); ball.x=100; ball.y=100; line=new Sprite ; line.graphics.lineStyle(1); line.graphics.lineTo(300,0); addChild(line); line.x=50; line.y=200; line.rotation=25;//将line旋转形成斜面 stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); rect = line.getBounds(this);//获取line的矩形边界 graphics.beginFill(0xefefef) graphics.drawRect(rect.left,rect.top,rect.width,rect.height); graphics.endFill(); } private function MouseDownHandler(e:Event) { addEventListener(Event.ENTER_FRAME,EnterFrameHandler); } private function EnterFrameHandler(e:Event):void { //line.rotation = (stage.stageWidth/2 - mouseX)*0.1; //普通的运动代码 ball.vy+=gravity; ball.x+=ball.vx; ball.y+=ball.vy; /*//只有二者(的矩形边界)碰撞了才需要做处理 if (ball.hitTestObject(line)) {*/ //也可以换成下面的方法检测 if (ball.x > rect.left && ball.x < rect.right && ball.y >rect.top && ball.y < rect.bottom){ //trace("true"); //获得角度及正余弦值 var angle:Number=line.rotation*Math.PI/180; var cos:Number=Math.cos(angle); var sin:Number=Math.sin(angle); //获得 ball 与 line 的相对位置 var dx:Number=ball.x-line.x; var dy:Number=ball.y-line.y; //反向旋转坐标(得到ball“相对”斜面line的坐标) var x2:Number=cos*dx+sin*dy; var y2:Number=cos*dy-sin*dx; //反向旋转速度向量(得到ball“相对”斜面的速度) var vx2:Number=cos*ball.vx+sin*ball.vy; var vy2:Number=cos*ball.vy-sin*ball.vx; //实现反弹 if (y2>- ball.height/2) { y2=- ball.height/2; vy2*=bounce; //将一切再正向旋转回去 dx=cos*x2-sin*y2; dy=cos*y2+sin*x2; ball.vx=cos*vx2-sin*vy2; ball.vy=cos*vy2+sin*vx2; //重新定位 ball.x=line.x+dx; ball.y=line.y+dy; } } //跑出舞台边界后将其重新放到原始位置 if (ball.x>=stage.stageWidth-ball.width/2||ball.y>=stage.stageHeight-ball.height/2) { ball.x=100; ball.y=100; ball.vx=0; ball.vy=0; removeEventListener(Event.ENTER_FRAME,EnterFrameHandler); } } } }