渲染ArrayList,按其对象的y位置排序

时间:2014-07-09 18:02:58

标签: java arraylist slick2d

解决(向下滚动)

我目前正在使用游戏库 Slick2d 开发Java游戏。游戏本身是2D,但你可以移动到背景或前景。

我的问题

我目前正在尝试制作类似渲染顺序的东西,这相当于CSS的“z-index”。否则,播放器后面的对象将呈现在播放器上方。

  • 如何排序
  • 如何正确呈现

到目前为止我的代码

public static List<Entity> entities;

public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
    entities = new ArrayList<Entity>();

    entities.add(new Player(100,100, 0));

    for(int i=0;i<10;i++){
        entities.add(new Fire(new Random().nextInt(Window.WIDTH), new Random().nextInt(Window.HEIGHT), i));
        entities.add(new Torch(new Random().nextInt(Window.WIDTH), new Random().nextInt(Window.HEIGHT), i));
        entities.add(new PassiveMob(new Random().nextInt(Window.WIDTH), new Random().nextInt(Window.HEIGHT), i));
    }
}

如您所见,我正在向ArrayList添加实体。每个实体都有xy位置以及widthheight(Fire,Torch,PassiveMob和Player是实体的实例)。

public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
    for(int i=0;i<entities.size();i++){
        entities.get(i).update(delta);
    }
}

这里我只是更新每个实体。

public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
    for(int i=0;i<entities.size();i++){
        entities.get(i).render(g);
    }
}

最后,我正在渲染每个实体。

我的想法

  • 创建自定义“renderOrder”列表
  • 按Y轴排序每个实体并以此自定义顺序呈现
  • 寻找Slick2D提供的方法来管理此

Current

解决方案

我设法在更新每个实体后使用以下代码修复它:

    Collections.sort(entities, new Comparator<Entity>() {
        @Override
        public int compare(Entity o1, Entity o2) {
            final int y1 = o1.y+o1.anim.getCurrentFrame().getHeight();
            final int y2 = o2.y+o2.anim.getCurrentFrame().getHeight();
            return y1 < y2 ? -1 : y1 > y2 ? 1 : 0;
        }
    });

这会根据y轴对每个刻度排序ArrayList<Entity>

2 个答案:

答案 0 :(得分:1)

首先应该在你的Entity类中添加Z索引,并确保玩家的Z索引是游戏中任何对象的最低或最高(取决于你想要的方式)排序)。

然后,您可以使用按实体的Z索引排序的自定义比较器,然后使用该比较器对entities列表进行排序。然后,像正常一样迭代它并渲染!

Here是一个SO问题,向您展示如何进行自定义排序。

答案 1 :(得分:1)

您必须为每个实体添加z坐标 然后按z递减排序,并按顺序绘制。 (您可以使用自定义比较器执行此操作,我将其称为SortByZDescending

z坐标定义实体与屏幕的距离 我会使用0作为最接近用户的2.5 d级别 像背景图形更远的水平上的实体获得更高的z水平。