使用ArrayList排序的图形绘制顺序



也有类似的问题,但他们在问如何做到这一点。我知道怎么做,但我想知道为什么在我即将提到的案件中它不起作用。

我一直在尝试调整2D游戏的引擎——有点像《塞尔达传说》。它有级别、瓦片、实体(这听起来可能很熟悉),到目前为止,我用它实现的一切都很好。我创建了一个名为Wanderer的实体,不出所料,它在关卡中漫游。当我第一次上这个课的时候,我很恼火它总是超越我的球员角色,而不管我的位置如何。因此,我认为一个简单的解决方案是根据每个实体的y位置不断地对Level类的"实体"ArrayList进行排序。

 public void tick(){
    Collections.sort(entities, new DrawComp());
    for(Entity e : entities){
        e.tick();
    }
    for(Tile t : Tile.tiles){
        if(t == null) break;
        t.tick();
    }
}
class DrawComp implements Comparator<Entity>{
    public int compare(Entity e1, Entity e2){
        if(e1.y < e2.y) return -1;
        else if(e1.y == e2.y){
            if(e1.x < e2.x) return -1;
        }
        return 0;
    }
}      

效果很好。我在屏幕上有几个流浪者,如果我走在一个后面,我的球员会在后面打平,如果我在一个前面,我的队员会在前面打平。当我增加更多流浪者时,问题就会出现。整个事情都崩溃了。当我在上面显示实体的索引时,我会看到17的索引高于37的索引,36的索引高于22的索引。它对某些人有效,对其他人无效。

我想知道的是:为什么ArrayList排序函数不能始终正常工作?以更快的速度对较大的ArrayList进行排序是否会占用太多资源?


在比较代码中,为什么只返回-1或0?如果e1.y>e2.y,则应该返回1,类似于以下内容:

    if(e1.y < e2.y) return -1;
    else if(e1.y == e2.y){
        if(e1.x < e2.x) {
            return -1;
        } else if (e1.x > e2.x) {
            return 1;
        }
        return 0;
    }
    return 1;

最新更新