我在确定渲染对象的顺序时遇到了一些独特的问题,特别是当玩家在墙后的情况下。我将尝试并彻底解释,因此为大量信息做好准备。
我向后渲染(这里推荐的是: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);
}这就是事情变得棘手的地方,我所有的角色都使用矩形的实例,它们的排序完全没有问题,但是我的墙(由于等距游戏的性质)不能使用矩形,因此使用适合他们大小的多边形。见图:

我必须使用一个多边形,因为如果我使用一个矩形,我会在靠近墙的地方得到一个愚蠢的无法通过的空间,就像这样:

不幸的是,由于多边形的性质,没有直接明显的测试来查看玩家是在墙的前面还是后面。第3行似乎是一个可能的候选测试,但墙的两边都有两个三角形,可以通过player.getPhysics.getY() > wall.getPhysics.getY()测试并将他标记为在前面,而他既可以在墙前也可以在墙后。

那么,当他在对角线后面时,我如何设计一个测试来告诉我?Java中形状和多边形的特性似乎对我有很大的限制,但我相信有一种方法可以做到这一点。我已经使用了很多点,并且getCenterY()已经非常接近了,但是它仍然不完美。我尝试过的所有方法出现的问题案例如下所示:

实际上在后面,在前面渲染
或者这样:

实际上在前面,在后面渲染。
有谁有什么想法吗?
发布于 2013-02-04 23:46:01
假设您的角色位于(x,y)处,墙有一条从(a,b)到(c,d)的中心线。然后,您可以使用行列式的符号
| x a c |
| y b d | = ab + ad + cy - ay - cb - xd
| 1 1 1 |确定由这三个点组成的三角形是顺时针还是逆时针。您可以为摄影机而不是角色计算类似的行列式,并将结果相乘。如果乘积为正,则相机和角色位于墙的同一侧,并且您希望在墙后绘制角色。如果产品是负片,那么相机和角色处于相反的两边,您想要在墙前绘制角色。
这种简化假设你的墙是直线或线段,而不是旋转的矩形,但除非你的玩家可以真正在墙内移动,否则差异应该无关紧要,除非相机看起来几乎正面朝墙的短边。因此,也许你想要一个大的矩形边界框来做粗略的排序,并且只有当玩家在这个(仍然可以通过的)边界框内时才使用上面的边界框。
发布于 2015-01-09 18:30:35
这不是那么容易!。为什么?因为你有其他的精灵参与到场景中(不只有2个。例如,你需要2个玩家+1个墙)。如何对它们进行排序以进行渲染?你必须始终使用x,y,z来分别确定“前面,后面,后面”的位置。
注释:经过2个月(艰难)的问题分析后,我终于为我的新cocos2d-js游戏找到并实现了一个“正确的渲染绘图”。解决方案在于映射,对于每个瓷砖(易受影响的),精灵是“前、后和后”。一旦这样做了,你就可以按照“递归逻辑”来绘制它们。
https://stackoverflow.com/questions/14670105
复制相似问题