всех случаев я не припомню, но обычно я делаю по 2 варианту и меня это устраивает, тк особо сложных расчетов я не делал, но сейчас я хочу использовать ниже приведенный код в котором последний раз замечал это.
1.

Код AS1/AS2:
var step=sss;
function placeBug() {
lev++;
var d = _root.bug.duplicateMovieClip("bg" + lev, lev);
d._x =xxx;
d._y =yyy;
d._rotation =rrr;
d.onEnterFrame=function(){
var angle =this._rotation*3.141/180;
var bugX = this._x + step * _global.Math.cos(angle);
var bugY = this._y + step * _global.Math.sin(angle);
var myPoint1:Object = {x:7, y: 6}; this.localToGlobal(myPoint1);
var myPoint2:Object = {x:7, y:-6}; this.localToGlobal(myPoint2);
if (land.hitTest(myPoint1.x, myPoint1.y, true)||land.hitTest(myPoint2.x, myPoint2.y, true)){
if (land.hitTest(myPoint1.x, myPoint1.y, true)){this._rotation-=20;};
if (land.hitTest(myPoint2.x, myPoint2.y, true)){this._rotation+=20;};
}else{
this._x = bugX;
this._y = bugY;}
}
}
2.

Код AS1/AS2:
var step=sss;
function placeBug() {
lev++;
var d = _root.bug.duplicateMovieClip("bg" + lev, lev);
d._x =xxx;
d._y =yyy;
d._rotation =rrr;
bugsArray.push(d);
}
function moveBugs() {
var i = _root.bugsArray.length;
var bugsArr = _root.bugsArray;
var b_cos :Function = _global.Math.cos;
var b_sin :Function = _global.Math.sin;
while(i--) {
var bugA = bugsArr[i];
var angle =bugA._rotation*3.141/180;
var bugX = bugA._x + step * b_cos(angle);
var bugY = bugA._y + step * b_sin(angle);
var myPoint1:Object = {x:7, y: 6}; bugA.localToGlobal(myPoint1);
var myPoint2:Object = {x:7, y:-6}; bugA.localToGlobal(myPoint2);
if (land.hitTest(myPoint1.x, myPoint1.y, true)
||land.hitTest(myPoint2.x, myPoint2.y, true)){
if (land.hitTest(myPoint1.x, myPoint1.y, true)){bugA._rotation-=20;};
if (land.hitTest(myPoint2.x, myPoint2.y, true)){bugA._rotation+=20;};
}else{
bugA._x = bugX;
bugA._y = bugY;}
}
}
[/as]