2

我在确定应该渲染对象的顺序时遇到了一些独特的麻烦,尤其是在玩家在墙后的情况下。我将尝试彻底解释,因此请准备大量信息。

我将事物从前渲染(这里推荐:绘制等距游戏世界),也就是说,在大多数情况下,足够简单。我使用一个简单的比较器确定后面的内容:

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() 已经相当接近了,但它仍然不完美。我尝试过的所有方法出现的问题案例如下所示:

其实在后面,在前面渲染其实在后面,在前面渲染

或这个:

其实在前面,渲染在后面实际上在前面,在后面渲染。

有人有任何想法吗?

4

2 回答 2

2

假设你的角色位于 (x, y) 并且墙壁有一条从 (a, b) 到 (c, d) 的中心线。然后你可以使用行列式的符号

| x a c |
| y b d | = ab + ad + cy - ay - cb - xd
| 1 1 1 |

来决定由这三个点组成的三角形是顺时针还是逆时针。您可以为相机而不是角色计算类似的行列式,并将结果相乘。如果产品是正面的,那么相机和人物在墙的同一侧,你想在墙画人物。如果产品是负片,那么相机和角色在对面,你想在墙前画角色。

这种简化假设您的墙是线或线段,而不是旋转的矩形,但除非您的玩家实际上可以在墙内移动否则差异应该无关紧要,除非相机看起来非常正面朝向墙的短边。因此,也许您毕竟想要一个大的矩形边界框来进行粗略排序,并且仅当玩家在这个(仍然可以通过的)边界框内时才使用上述内容。

于 2013-02-04T15:46:01.197 回答
0

没那么容易!!!!为什么?因为您在场景中包含了其他精灵(不仅是 2 个。例如,您需要有 2 个玩家 + 1 个墙)。你如何订购它们进行渲染?您必须始终使用分别确定“前、后、后”位置的 x、y、z 工作。

注意:在对问题进行了 2(硬)个月的分析后,我终于为我的新 cocos2d-js 游戏找到并实现了“正确的渲染绘图”。解决方案包括为每个图块(易受影响的)映射哪些精灵是“前、后和后”。一旦这样做,您就可以按照“递归逻辑”绘制它们。

于 2015-01-09T10:30:35.190 回答