Вот, это должно работать, но это не лучший вариант

Код AS3:
import flash.display.Sprite;
import flash.text.*;
import flash.events.KeyboardEvent;
import flash.events.Event;
var speed:int = 20;
var dy:int = 0;
var dx:int = 0;
stage.addEventListener(MouseEvent.CLICK,addBall);
function addBall(e:MouseEvent):void
{
var ball:Ball=new Ball();
addChild(ball);
ball.x = mouseX;
ball.y = mouseY;
myText.text = Ball.allBalls.length.toString();//Вывод длины массива в текст.
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDown);
function keyDown(e:KeyboardEvent):void
{
trace(e.keyCode);
if (e.keyCode == 37)
{
dx = (-1)* speed;
}
if (e.keyCode == 38)
{
dy = (-1)* speed;
}
if (e.keyCode == 39)
{
dx = speed;
}
if (e.keyCode == 40)
{
dy = speed;
}
}
stage.addEventListener(KeyboardEvent.KEY_UP,keyUp);
function keyUp(e:KeyboardEvent):void
{
if (e.keyCode == 37)
{
dx = 0;
}
if (e.keyCode == 38)
{
dy = 0;
}
if (e.keyCode == 39)
{
dx = 0;
}
if (e.keyCode == 40)
{
dy = 0;
}
}
this.addEventListener(Event.ENTER_FRAME,onFrame);
function onFrame(e:Event):void
{
for (var i=0; i<Ball.allBalls.length; i++)
{
var port:Ball = Ball.allBalls[i];
port.x += dx;
if(dy!=0)
port.y += dy-port.yspeed;
}
}

Код AS3:
package{
import flash.display.MovieClip;
import flash.events.Event;
public class Ball extends MovieClip{
public static var allBalls:Array=[];
var xspeed:Number=-10+Math.random()*20;
public var yspeed:Number=-5;
var grav:Number=1;
var radius:Number;
public function Ball(){
scaleX=scaleY=Math.random()*0.5+0.5;
radius=width/2
allBalls.push(this);
addEventListener(Event.ENTER_FRAME,onFrame);
trace(allBalls.length)
}
public function onFrame(e:Event):void{
yspeed+=grav;
xspeed*=0.9;
y+=yspeed;
x+=xspeed;
hitSelf()
hitStage()
}
public function hitSelf():void{
for(var i=0;i<allBalls.length;i++){
var currentBall=allBalls[i];
if(currentBall!=this){
var dx=currentBall.x-x;
var dy=currentBall.y-y;
var dis=Math.sqrt(dx*dx+dy*dy);
var needDist=radius+currentBall.radius;
if(dis<needDist){
var ang1=Math.atan2(currentBall.y-y,currentBall.x-x)
var ang2=Math.atan2(y-currentBall.y,x-currentBall.x)
x += Math.cos(ang1) * ((dis-needDist)/2)
y += Math.sin(ang1) * ((dis-needDist)/2)
xspeed += Math.cos(ang1) * ((dis-needDist)/2)
yspeed += Math.sin(ang1) * ((dis-needDist)/2)
currentBall.x += Math.cos(ang2) * ((dis-needDist)/2)
currentBall.y += Math.sin(ang2) * ((dis-needDist)/2)
currentBall.xspeed += Math.cos(ang2) * ((dis-needDist)/2)
currentBall.yspeed += Math.sin(ang2) * ((dis-needDist)/2)
}
}
}
}
public function hitStage():void{
if(x>300-radius){
x=300-radius
xspeed=0;
}
if(x<radius){
x=radius
xspeed=0;
}
if(y>300-radius){
y=300-radius;
yspeed=-yspeed*0.2
}
}
}
}