也有类似的问题,但他们在问如何做到这一点。我知道怎么做,但我想知道为什么在我即将提到的案件中它不起作用。
我一直在尝试调整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;