确定等距游戏和不规则形状的绘制顺序(Java)

时间:2013-02-03 06:40:14

标签: java math drawing rendering isometric

我在确定渲染对象的顺序方面遇到了一些独特的麻烦,特别是在玩家在墙后面的情况下。我会尝试彻底解释,所以要准备好很多信息。

我将事情重新渲染到前面(按照此处的建议: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实例,它们的排序完全没有问题,但是我的墙(由于等距游戏的性质)不能使用矩形,因此使用适合其大小的多边形。 见图:This is what the hitboxes for a player and a wall look like.

我必须使用一个Polygon,因为如果我使用一个矩形,我会在墙附近得到一个愚蠢的无法通行空间,如下所示: Stupid.

不幸的是,由于多边形的性质,没有立即明显的测试,看看玩家是在墙前还是在墙后。第3行似乎是一个可能的候选人作为测试,但是墙的两侧有两个三角形可以通过player.getPhysics.getY() > wall.getPhysics.getY()测试并将他标记为在前面,当他可以在前面和后面壁。

Grr

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

Actually behind, rendered in front实际上落后于前面的

或者这个:

Actually in front, rendered behind实际上是在前面,后面渲染。

有人有任何想法吗?

2 个答案:

答案 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;。

绘制它们