我目前正在使用游戏库 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添加实体。每个实体都有x
和y
位置以及width
和height
(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);
}
}
最后,我正在渲染每个实体。
我设法在更新每个实体后使用以下代码修复它:
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>
!
答案 0 :(得分:1)
首先应该在你的Entity
类中添加Z索引,并确保玩家的Z索引是游戏中任何对象的最低或最高(取决于你想要的方式)排序)。
然后,您可以使用按实体的Z索引排序的自定义比较器,然后使用该比较器对entities
列表进行排序。然后,像正常一样迭代它并渲染!
Here是一个SO问题,向您展示如何进行自定义排序。
答案 1 :(得分:1)
您必须为每个实体添加z坐标
然后按z递减排序,并按顺序绘制。 (您可以使用自定义比较器执行此操作,我将其称为SortByZDescending
。
z坐标定义实体与屏幕的距离 我会使用0作为最接近用户的2.5 d级别 像背景图形更远的水平上的实体获得更高的z水平。