我在测试游戏中进展缓慢,我已经达到可以通过数组在舞台上添加敌人的地步,它们会跟随玩家并朝着玩家旋转而不会出现任何问题。我的下一个任务是赋予每个敌人彼此碰撞检测,否则它们最终会完全重叠,这是不太现实的。
这是我到目前为止关于敌人的代码:
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;
}
所以这就是我被困住的地方。对着敌人。hitTestObject部分,我最初只是让敌人hitTesting敌人,但这会导致敌人击中测试本身,并完全搞砸了移动和旋转。所以我尝试了上述方法,即使用数组下一个位置的敌人实例来测试每个敌人实例,它适用于大多数敌人,但不是所有敌人,并产生一个错误,因为数组中的最后一个实例将尝试测试一个不存在的实例,这将导致性能大幅下降。
有人能给我一些方向上一个更好的方式来击中测试这些对象从数组,更性能友好?
为了消除错误,i应该小于(enemyArray)。长度- 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/