Столкнулся с очередной головоломкой!
Наглядный пример - пули должны разбиваться о блок, что и происходит, пока пули летят через фрейм или реже (первая часть примера). Но стоит запустить их в каждом фрейме (вторая часть) - как нате вам.. Видно под таким напором блок устоять не может и поддается
Ширина пули больше её шага. Плюс ширина блока. Перескакивание невозможно! И если fps маленький - отлично видно, что пули ПЕРЕСЕКАЮТ блок.
Основной код:

Код AS3:
var aBlt:Array = []; // массив для хранения пуль
var j:Number = 0;
var fMode:Boolean=true;
mBlck.x = 500;
stage.addEventListener(Event.ENTER_FRAME, fn1);
stop();
function fn1(event:Event):void{
mBlck.x-=1; // двигаем блок навстречу пулям
if(mBlck.x<50){
mBlck.x=500;
fMode=!fMode; // переключаем режимы 'стрельбы'
}
if(fMode){ // режимы 'стрельбы'
if(j++>0){ // добавляем пулю через фрейм
j=0;
var mc:MovieClip=new mBullet();
mc.x = 0;
mc.y = 100 + Math.random() * 30;
this.addChild(mc);
aBlt.push(mc);
}
} else {
// ..тоже самое! Но каждый фрейм.
mc = new mBullet();
mc.x = 0;
mc.y=300 - Math.random() * 30;
this.addChild(mc);
aBlt.push(mc);
}
// проверяем на пересечение с блоком
for each(var m:MovieClip in aBlt){
if(mBlck.hitTestObject(m)){
m.fnHit(); // сообщаем пуле о попадании
aBlt.splice(aBlt.indexOf(m), 1); // удаляем из списка
this.removeChild(m);
}
}
}
function fnDel(zzz:DisplayObject):void {
this.removeChild(zzz);
zzz = null;
}
Код пули:

Код AS3:
var m:MovieClip=MovieClip(this.parent);
var nStp:Number=10; // шаг для пули
this.addEventListener(Event.ENTER_FRAME, fn1);
function fn1(event:Event):void{
if(x>550){ // если вылетели за этот предел..
this.removeEventListener(Event.ENTER_FRAME, fn1); // ..удаляем обработчик..
m.fnDel(this); // ..и себя
return;
}
x+=nStp; // двигаемся на этот шаг
}
function fnHit():void{
this.removeEventListener(Event.ENTER_FRAME, fn1);
}