搜索最近的精灵 - Andengine - Android

时间:2012-10-20 15:10:33

标签: android search andengine point

当我尝试在我的播放器附近找到精灵时,我遇到了麻烦。我有一个小地图和侧面滚动。只有成长和中间球员。他可以看起来向左或向右走,如果你的球员向左看并且你按下“击球”,我会在我的玩家链接列表中搜索最接近我的玩家的暴徒,我会让这个暴徒接受损坏。

我有这个代码: - 小怪是我的怪物链接列表。 (AnimatedSprite的扩展)

这是我的第一个游戏,我不知道是否有更好的方法来做到这一点,这不要搜索越近,只有我的列表的第一个元素,任何想法? :)

public void shot(){
    float playerx = player.getX();
    Mob target = mobs.element();
    if(player.getDireccion()==Entidad.DIR_IZQUIERDA){//If direction if left
        for(Mob z:mobs){
            if(z.getX()<playerx &&
               z.getX()>target.getX())
                target= z;
        }
    }else if(player.getDireccion()==Entidad.DIR_DERECHA){//If direction is right
        for(Mob z:mobs){
            if(z.getX()>playerx && z.getX()<target.getX())
                target= z;
        }
    }

    target.recibeDaño();//receibe damaget (loss life basically)

    if(objetivo.getVida()<=0){ //These delete body and sprite of the game
        final Mob eliminar = target;
        eliminarZombie(eliminar,this);
        mobs.remove(target);
        System.gc();
    }
}

对不起我的英语。

1 个答案:

答案 0 :(得分:1)

遍历所有敌人并计算距离

距离= x2 - x1

其中x2是敌人的x属性,x1是玩家的x属性

如果你面向正确,只考虑正距离,如果你面向左边,只考虑负距离

然后选择距离的最小绝对值

所以它就是这样的

float shortest = 1000; //just put a large number here

for(Mob z:mobs){
    distance = z.x - player.x;
    if((player.getDirection == Direction.RIGHT) && distance > 0 && distance < shortest){
        //set the target to the current mob and change the value of the shortest
    }
    if((player.getDirection == Direction.LEFT) && distance < 0 && Math.abs(distance) < shortest){
        //same as above
    }
}
//damage the target here and remove it

注意我没有处理目标在敌人之上且距离== 0

的情况

你的代码也应该工作,但不是循环遍历列表两次,最好循环一次

关于您的代码的其他说明是:

  • 不要打电话给System.gc(),不是个好主意
  • 如果你想从链接列表中删除一个项目,请使用this.runOnUpdateThread()在updateThread上删除它并给它一个runnable [如果你不这样做,你的游戏会随机崩溃]
  • 您也可以使用迭代器来检查项目,然后使用.remove()删除您到达的最新项目,它是线程安全的