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

标签 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;
    }
};

这使用实体的碰撞盒来确定其渲染顺序,并且对于具有矩形碰撞盒的实体来说它可以完美地工作(就像我所有的角色一样)。实际的绘制调用如下所示:

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);
    }

这就是事情变得棘手的地方,我所有的角色都使用矩形的实例,并且它们的排序完全没有问题,但我的墙(由于等距游戏的性质)不能使用矩形,因此使用适合其大小的多边形。 看图: This is what the hitboxes for a player and a wall look like.

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

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

Grr

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

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

或者这个:

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

有人有什么想法吗?

最佳答案

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

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

决定这三个点形成的三角形是顺时针还是逆时针方向。您可以为相机而不是角色计算类似的行列式,然后将结果相乘。如果产品是正数,则相机和角色位于墙的同一侧,并且您想在墙之后绘制角色。如果产品是,则相机和角色位于相对侧,并且您希望将角色绘制在墙前

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

关于java - 确定等距游戏和不规则形状的绘制顺序 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14670105/

相关文章:

php - PHP number_format() 出现奇数除法错误

html - Literally Canvas - 我在我的页面上找不到任何工具?

Android - 在 SurfaceView 上绘制简单的正弦波

java - 如何防止同步方法中的死锁?

java - 不确定如何处理多点触控

math - 在网络上编写数学方程的最佳方法是什么?

c# - 使用 XAML 和路径标记语言的图表背景

java - 阻止 JBoss 5.0.1 部署 WAR 文件中的所有内容

java - JSF 中基于表单的身份验证

Matlab:如何在我的例程中接收函数(如 exp)作为参数?