首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定等轴测游戏和不规则形状的绘图顺序(Java)

问确定等轴测游戏和不规则形状的绘图顺序(Java)
EN

Stack Overflow用户
提问于 2013-02-03 14:40:14
回答 2查看 1.4K关注 0票数 2

我在确定渲染对象的顺序时遇到了一些独特的问题,特别是当玩家在墙后的情况下。我将尝试并彻底解释,因此为大量信息做好准备。

我向后渲染(这里推荐的是:Drawing Isometric game worlds),这在很大程度上是足够简单的。我使用一个简单的比较器来确定后面是什么:

代码语言:javascript
复制
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的实体,它可以完美地工作(就像我的几乎所有角色一样)。实际的绘图调用如下所示:

代码语言:javascript
复制
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()已经非常接近了,但是它仍然不完美。我尝试过的所有方法出现的问题案例如下所示:

​

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

或者这样:

​

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

有谁有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-04 23:46:01

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

代码语言:javascript
复制
| x a c |
| y b d | = ab + ad + cy - ay - cb - xd
| 1 1 1 |

确定由这三个点组成的三角形是顺时针还是逆时针。您可以为摄影机而不是角色计算类似的行列式,并将结果相乘。如果乘积为正,则相机和角色位于墙的同一侧,并且您希望在墙后绘制角色。如果产品是负片,那么相机和角色处于相反的两边,您想要在墙前绘制角色。

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

票数 2
EN

Stack Overflow用户

发布于 2015-01-09 18:30:35

这不是那么容易!。为什么?因为你有其他的精灵参与到场景中(不只有2个。例如,你需要2个玩家+1个墙)。如何对它们进行排序以进行渲染?你必须始终使用x,y,z来分别确定“前面,后面,后面”的位置。

注释:经过2个月(艰难)的问题分析后,我终于为我的新cocos2d-js游戏找到并实现了一个“正确的渲染绘图”。解决方案在于映射,对于每个瓷砖(易受影响的),精灵是“前、后和后”。一旦这样做了,你就可以按照“递归逻辑”来绘制它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14670105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档