我在确定应该渲染对象的顺序时遇到了一些独特的麻烦,尤其是在玩家在墙后的情况下。我将尝试彻底解释,因此请准备大量信息。
我将事物从前渲染(这里推荐:绘制等距游戏世界),也就是说,在大多数情况下,足够简单。我使用一个简单的比较器确定后面的内容:
private Comparator<Entity> spriteSorter = new Comparator<Entity>(){
public int compare(Entity e1, Entity e2){
if(e1.getPhysics().getY() > e2.getPhysics().getY()) return 1;
if(e1.getPhysics().getY() < e2.getPhysics().getY())return -1;
return 0;
}
};
这使用实体的命中框来确定其渲染顺序,并且对于具有矩形命中框的实体(几乎所有我的角色都这样做),它可以完美地工作。实际的绘图调用如下所示:
ArrayList<Entity> spriteList = new ArrayList<>();
spriteList.add(player);
for(int i = 0; i < walls.size(); i++){
spriteList.add(walls.get(i));
}
Collections.sort(spriteList, spriteSorter);
for(int i = 0; i < spriteList.size(); i++){
spriteList.get(i).render(g);
}
但这就是事情变得棘手的地方,我的所有角色都使用 Rectangle 的实例,并且它们的排序完全没有问题,但是我的墙壁(由于等距游戏的性质)不能使用矩形,因此使用 Polygon适合他们的尺寸。见图片:
我必须使用多边形,因为如果我使用矩形,我会在墙壁附近得到一个愚蠢的无法通过的空间,如下所示:
不幸的是,由于多边形的性质,没有立即明显的测试来确定玩家是在墙的前面还是后面。第 3 行似乎是一个可能的测试候选人,但在墙的两边都有两个三角形可以通过player.getPhysics.getY() > wall.getPhysics.getY()
测试并将他标记为在前面,而他可能同时在墙的前面和后面。
那么,我如何设计一个测试来告诉我他什么时候在对角线后面呢?Java 中形状和多边形的本质似乎限制了我很多,但我确信有办法做到这一点。我玩过很多点,getCenterY() 已经相当接近了,但它仍然不完美。我尝试过的所有方法出现的问题案例如下所示:
其实在后面,在前面渲染
或这个:
实际上在前面,在后面渲染。
有人有任何想法吗?