3

当我尝试将精灵定位在离我的播放器更近的地方时,我遇到了麻烦。我有一个小地图和侧卷轴。中间只有一个成长和一个球员。他可以向左或向右看和走,如果你的玩家向左看并且你按“射击”,我会在我的小怪链接列表中搜索我的玩家最接近的小怪,然后我让这个小怪接受伤害。

我有这个代码: - mobs 是我的小怪链表。(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();
    }
}

对不起我的英语。

4

1 回答 1

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 上删除它并给它一个可运行的[如果你不这样做,你的游戏会随机崩溃]
  • 您也可以使用迭代器检查项目,然后使用 .remove() 删除您到达的最新项目,它是线程安全的
于 2012-11-05T19:28:32.987 回答