【问题标题】:Determining draw order for isometric games and irregular shapes (Java)确定等距游戏和不规则形状的绘制顺序(Java)
【发布时间】: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() &gt; wall.getPhysics.getY() 测试并将他标记为在前面,而他可能同时在墙的前面和后面。

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

其实在后面,渲染在前面

或者这个:

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

有人有什么想法吗?

【问题讨论】:

  • 最好发到gamedev.stackexchange.com
  • 我以前在那儿发过帖子,那里的人数大约是 1/10。我很少得到答案。 :(
  • 最后一张图片中的角色似乎正在走下墙后的一段台阶。如果角色沿着墙后的(水平)通道行走,x,y 位置的图像应该完全被墙的图像挡住。或者换句话说,我认为你的角色放置逻辑搞砸了。
  • 您是否考虑过使用现有的物理引擎来完成这项工作?
  • 我知道我的角色放置逻辑搞砸了,这就是帖子的重点。从数学上讲,hitbox 将他放在墙前,压在墙上(回到墙),但它以错误的顺序绘制。这就是我需要帮助的地方。

标签: java math drawing rendering isometric


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 2010-10-05
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多