【问题标题】:My game collision system doesn't work on more than one tile我的游戏碰撞系统不能在多个图块上工作
【发布时间】:2021-06-12 20:41:43
【问题描述】:

我正在为我的游戏开发一个碰撞系统,但是如果我添加多于一堵墙(这是我正在渲染的对象),我无法让它工作,碰撞系统不起作用并且我可以通过街区。

但是,如果我只留下一堵墙,碰撞可以正常工作,或者如果在循环结束时我添加了一个中断; 碰撞有效,但仅在地图的第一面墙上,其他墙壁不会发生碰撞。

有人知道如何解决这个问题吗?我已经尝试解决了 2 天,但我无法解决。

    public boolean checkCollisionWall(int xnext, int ynext){
        int[] xpoints1 = {xnext+3,xnext+3,xnext+4,xnext+3,xnext+3,xnext+4,xnext+10,xnext+11,xnext+11,xnext+10,xnext+11,xnext+11};
        int[] ypoints1 = {ynext+0,ynext+8,ynext+9,ynext+11,ynext+12,ynext+15,ynext+15,ynext+12,ynext+11,ynext+9,ynext+8,ynext+0};
        int npoints1 = 12;
        Polygon player = new Polygon(xpoints1,ypoints1,npoints1);
        Area area = new Area(player);
        for(int i = 0; i < Game.walls.size(); i++){
            Wall atual = Game.walls.get(i);
            int[] xpoints2 = {atual.getX(),atual.getX(),atual.getX()+16,atual.getX()+16};
            int[] ypoints2 = {atual.getY(),atual.getY()+16,atual.getY()+16,atual.getY()};
            int npoints2 = 4;
            Polygon Wall = new Polygon(xpoints2,ypoints2,npoints2);
            area.intersect(new Area(Wall));
            if(area.isEmpty()){
                return true;
            }
        }
    return false;
    }

【问题讨论】:

  • 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后edit你的问题包括你拥有的完整源代码作为minimal reproducible example,其他人可以编译和测试。请看:What Do You Mean “It Doesn't Work”?
  • 您确认Area 类按预期工作了吗?
  • 区域正常,碰撞也正常,但是如果我在地图上添加多于一面墙,碰撞停止工作。

标签: java collision-detection polygon collision


【解决方案1】:

我很确定问题出在这个电话上:

area.intersect(new Area(Wall));

这是该方法的 JavaDoc:

public void intersect(Area rhs)

将此区域的形状设置为其当前形状的交点 以及指定区域的形状。该区域的最终形状 将仅包括该区域中包含的区域以及 在指定区域内。

所以area,它代表你的播放器的形状,每次测试都会修改一面墙,这就是为什么它只适用于一面墙。

您可以通过简单地将播放器 Area 作为调用的参数来解决此问题,如下所示:

Area wallArea = new Area(Wall); 
wallArea.intersect(area);
if(wallArea.isEmpty()){
    return true;
}

顺便说一句,这个逻辑是颠倒的不是吗。您不想检查生成的区域是否为空,即玩家和墙壁之间是否存在重叠?

如果每个Wall 实际上是一个矩形,另一种选择是改用Area 方法:

公共布尔相交(双x, 双 y, 双w, 双倍h)

测试 Shape 的内部是否与 a 的内部相交 指定的矩形区域。矩形区域被认为是 如果任何点都包含在两者的内部,则与 Shape 相交 形状和指定的矩形区域。

类似这样的:

if(area.intersects(atual.getX(), atual.getY(), 16, 16)) {
    return true;
}

由于这避免了为每面墙创建一个Area 对象,因此相交测试将变得更简单、更快。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多