package { import flash.display.Shape; import flash.display.Sprite; import flash.geom.Point; /** * Re: http://board.flashkit.com/board/showthread.php?t=797453 * @author makc * @license WTFPLv2 */ public class BouncingBall extends Sprite{ public function BouncingBall () { r = 10; ball = new Shape; ball.graphics.beginFill (0); ball.graphics.drawCircle (0, 0, r); addChild (ball); v = new Point; v.x = Math.random (); v.y = Math.random (); V = 1 + 20 * Math.random (); v.normalize (V); R = 200; X = 465 / 2; Y = 465 / 2; graphics.lineStyle (0); graphics.drawCircle (X, Y, R); ball.x = X + 100; ball.y = Y - 100; addEventListener ("enterFrame", loop); } private var r:Number; private var ball:Shape; private var v:Point; private var V:Number; private var R:Number; private var X:Number; private var Y:Number; private function loop (e:*):void { ball.x += v.x; ball.y += v.y; // R-r vector var P:Point = new Point (X - ball.x, Y - ball.y); if (P.length > Math.sqrt ((R - r) * (R - r))) { // normalize R-r vector P.normalize (1); // project v onto it var vp:Number = v.x * P.x + v.y * P.y; // subtract projection v.x -= 2 * vp * P.x; v.y -= 2 * vp * P.y; v.normalize (V); // move away from bounding circle P = new Point (X - ball.x, Y - ball.y); while (P.length > Math.sqrt ((R - r) * (R - r))) { ball.x += v.x; ball.y += v.y; P = new Point (X - ball.x, Y - ball.y); } } } } } Bouncing Ball