【问题标题】:Graphics Draw-Ordering using ArrayList sorting使用 ArrayList 排序的图形绘制排序
【发布时间】:2014-10-23 05:47:08
【问题描述】:

有类似的问题,但他们问如何这是完成的。我知道怎么做,但我想知道为什么它在我要提到的情况下不起作用。

我一直在尝试为 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 进行排序是否会占用太多资源?


【问题讨论】:

    标签: java performance sorting graphics arraylist


    【解决方案1】:

    在比较代码中,为什么只返回 -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;
    

    【讨论】:

    • 哦。我想我遵循了关于排序的在线教程,我发现错误^。^我发现的一个示例代码显示,如果整数(在这种情况下,工资)小于,则返回语句为 -1,如果不小于,则为 0。无论如何,这解决了它!
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2012-10-24
    • 2011-07-15
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    相关资源
    最近更新 更多