【发布时间】:2013-02-03 06:40:14
【问题描述】:
我在确定对象的渲染顺序时遇到了一些特殊的问题,尤其是当玩家在墙后时。我会尽力解释清楚,所以要准备好很多信息。
我将事物从前渲染(这里推荐:Drawing Isometric game worlds),也就是说,在大多数情况下,足够简单。 我使用一个简单的比较器确定后面的内容:
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 的实例,并且它们的排序完全没有问题,但是我的墙壁(由于等距游戏的性质)不能使用矩形,因此使用适合其大小的多边形。 见图片:
我必须使用多边形,因为如果我使用矩形,我会在墙壁附近得到一个愚蠢的无法通过的空间,如下所示:
不幸的是,由于多边形的性质,没有立即明显的测试来判断玩家是在墙的前面还是后面。第 3 行似乎是一个可能的候选测试,但墙的两侧有两个三角形可以通过player.getPhysics.getY() > wall.getPhysics.getY() 测试并将他标记为在前面,而他可能同时在墙的前面和后面。
那么,我如何设计一个测试来告诉我他什么时候在对角线后面? Java 中形状和多边形的性质似乎限制了我很多,但我确信有办法做到这一点。我玩过很多点,getCenterY() 已经相当接近了,但它仍然不完美。我尝试过的所有方法出现的问题情况如下:
其实在后面,渲染在前面
或者这个:
其实在前面,在后面渲染。
有人有什么想法吗?
【问题讨论】:
-
我以前在那儿发过帖子,那里的人数大约是 1/10。我很少得到答案。 :(
-
最后一张图片中的角色似乎正在走下墙后的一段台阶。如果角色沿着墙后的(水平)通道行走,x,y 位置的图像应该完全被墙的图像挡住。或者换句话说,我认为你的角色放置逻辑搞砸了。
-
您是否考虑过使用现有的物理引擎来完成这项工作?
-
我知道我的角色放置逻辑搞砸了,这就是帖子的重点。从数学上讲,hitbox 将他放在墙前,压在墙上(回到墙),但它以错误的顺序绘制。这就是我需要帮助的地方。
标签: java math drawing rendering isometric