我在确定渲染对象的顺序方面遇到了一些独特的麻烦,特别是在玩家在墙后面的情况下。我会尝试彻底解释,所以要准备好很多信息。
我将事情重新渲染到前面(按照此处的建议: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;
}
};
这使用实体的hitbox来确定它的渲染顺序,并且它对于具有矩形hitbox的实体(几乎所有我的角色都可以)完美地工作。实际的绘制调用如下所示:
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()已经相当接近,但它仍然不完美。我尝试的所有方法出现的问题都是这样的:
实际上落后于前面的
或者这个:
实际上是在前面,后面渲染。
有人有任何想法吗?
答案 0 :(得分:1)
假设你的角色位于(x,y),并且墙壁有一条从(a,b)到(c,d)的中心线。然后你可以使用行列式的符号
| x a c |
| y b d | = ab + ad + cy - ay - cb - xd
| 1 1 1 |
判断由这三个点形成的三角形是顺时针还是逆时针。您可以为相机而不是字符计算类似的行列式,并将结果相乘。如果产品正面,则相机和角色位于墙壁的同一侧,并且您想在墙后绘制角色 。如果产品否定,则相机和角色位于对侧,并且您想在墙前绘制字符。
这种简化假设您的墙是线条或线段,而不是旋转的矩形,但除非您的播放器能够实际移动在墙内,否则差异无关紧要,除非相机看起来非常正面在墙的短边。所以也许你想要一个大的矩形边框用于墙壁,做粗略的排序,只有当玩家在这个(仍然可以通过的)边界框内时才使用上面的。
答案 1 :(得分:0)
这不是那么容易!!!为什么?因为你在场景中有其他精灵(不仅仅是2.例如,你需要有2个玩家+ 1个墙)。你如何订购渲染? 你必须始终使用x,y,z来确定相应的&#34;前面,后面,后面的&#34;位置。
注意:经过2个(硬)个月的问题分析后,我终于找到并实施了一个正确的渲染图&#34;为我的新cocos2d-js游戏。解决方案包括为每个瓷砖(易受影响)映射哪些精灵是&#34;前面,后面和后面&#34;。 一旦这样做,您可以按照&#34;递归逻辑&#34;。
绘制它们