我的测试游戏进展缓慢,我已经达到了可以通过阵列向舞台添加敌人的程度,他们跟随玩家并向玩家旋转没有问题。我的下一个任务是让每个敌人互相碰撞检测,否则他们最终都会完全相互重叠,这不太现实。
到目前为止我的代码只针对敌人:
public function initEnemy():void
{
enemyArray = new Array();
for (var i = 0; i < 2; i++)
{
var enemy:Enemy = new Enemy((Math.random() *500 + 20), (Math.random() * 200 + 50));
stage.addChild(enemy);
enemyArray.push(enemy);
}
}
public function enemyBehavior():void
{
var enemyRotation:int;
for (var i:int = 0; i < enemyArray.length; i++)
{
var enemy = enemyArray[i];
var dx:int = enemy.x - player.x;
var dy:int = enemy.y - player.y;
var dr:int = dx * dx + dy * dy;
var dr2:int = Math.sqrt(dr);
enemy.x -= enemySpeed * dx / dr2;
enemy.y -= enemySpeed * dy / dr2;
enemyRotation = -(Math.atan2(enemy.x - player.x, enemy.y - player.y) * 180 / Math.PI);
trace(enemyRotation);
enemy.rotation = enemyRotation;
if (enemy.hitTestObject(enemyArray[i+1]))
{
enemy.x -= -enemySpeed;
enemy.y -= -enemySpeed;
}
所以,这就是我被困的地方。在enemy.hitTestObject部分,我原本只是敌人击中了敌人,但是这会导致敌人自己进行测试并完全搞砸了移动和旋转。所以我尝试了上面的内容,在阵列的下一个位置用敌人实例测试每个敌人实例,并且它适用于大多数敌人但不是全部,并且因为阵列中的最后一个实例而产生错误将尝试尝试测试一个不存在的实例,并且性能大幅下降。
有人可以给我一些方向,以更好的方式从阵列中测试这些对象,这些对象更友好吗?
答案 0 :(得分:1)
为了摆脱这个错误,我应该小于(enemyArray.length - 1),但逻辑仍然是错误的,因为它没有检查所有敌人之间的碰撞。要检查所有敌人之间的碰撞,您应该执行以下操作:
for (var i:int = 0; i < enemyArray.length - 1; i++) {
var enemy1 = enemyArray[i];
for(var j:int = i+1; j< enemyArray.length; j++) {
var enemy2 = enemyArray[j];
if(enemy1.hitTestObject(enemy2)){
//do something on collision
}
}
}
如果你想要一些高性能的东西,特别是如果你有很多敌人,你应该比较敌人的坐标,看看它们是否重叠。您可以在此处阅读有关多个对象的碰撞的更多信息:http://www.emanueleferonato.com/2008/06/07/managing-multiple-balls-collisions-with-flash-as3-version/