当前位置: 首页 > 知识库问答 >
问题:

java中的碰撞在基于网格的碰撞系统中检测速度不够快

杭泉
2023-03-14

我在java libgdx中使用2d布尔数组来处理真实点之间的冲突。我的碰撞检查,看看玩家是否可以左右移动或摔倒或跳跃。这一切都是可行的,但是碰撞速度不够快,无法检测到玩家应该在什么时候停止坠落。当玩家停下来的时候,他几乎已经在平台内部的五分之一了。

这是一个更好地描述我的意思的图片。玩家是粉红色的,可碰撞平台是红色的。下图显示的是一名球员刚刚从一个小的下降点降落到平台上,重力非常缓慢。

我的碰撞类非常直接,如果当前位置已经是真实的,不允许移动,这里是类只是为了参考。注意这个类功能齐全,只是很慢。

    @Override
public void run() {
    if(mapGrid.getGrid()[(int) (entity.getGridPosition().x + 1)][(int) entity.getGridPosition().y + 1]){
        entity.setCanMoveRight(false);
    }else
        entity.setCanMoveRight(true);

    if(mapGrid.getGrid()[(int) (entity.getGridPosition().x - 1)][(int) entity.getGridPosition().y + 1]){
        entity.setCanMoveLeft(false);
    }else
        entity.setCanMoveLeft(true);



    if(mapGrid.getGrid()[(int) (entity.getGridPosition().x)][(int) entity.getGridPosition().y] ||
            (mapGrid.getGrid()[(int) (entity.getGridPosition().x + 1)][(int) entity.getGridPosition().y] &&
                    !mapGrid.getGrid()[(int) (entity.getGridPosition().x)][(int) entity.getGridPosition().y])){
        entity.setCanFall(false);
    }else
        entity.setCanFall(true);



}

这里是一切都在更新的地方。

    @Override
public void render () {
    collisionHandler.run();
    player.update();
    mapGrid.update();

    tmpLogger.log();
    camera.position.set(player.getPosition(), 0);
    camera.translate(player.getPosition());
    camera.update();
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    tmpRend.begin();
    mapGrid.render(tmpRend);
    player.render(tmpRend);
    tmpRend.end();
}

非常感谢您的帮助。我只需要我的碰撞非常精确,而不是那种精确。非常感谢。

共有1个答案

郎诚
2023-03-14

据我所知,仅仅在碰撞后停止化身是不够的;在现实生活中,一个稍微慢一点的帧可以将你的化身嵌入到表面(正如你所经历的那样)-你需要检测碰撞点,然后将化身移动到只有碰撞点的距离。

另一种说法是,当你检测到与地面的碰撞时,你需要将化身向后移动,使其刚好位于地面之上。

 类似资料:
  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 所以我用Box2D在游戏中进行冲突检测。我有一个包含地形信息的地图:现在它只是一个有道路或草地的字符[][]。现在,在每个关卡开始时,我想创建矩形来描述不同的地形,但是我希望这些矩形得到优化,显然这需要相当多的算法。 我的第一个方法是在关卡开始时为地图上的每一个区块创建一个单独的地形。FPS降低到了5。 我的第二个想法是当玩家沿着地图移动时,简单地为地形创建不同的矩形,删除看不见的矩形。虽然它仍然

  • 我的问题主要与它背后的理论有关。我为一个项目制作了一个2D游戏,通过使用Rectangle类中的.overlapps方法检测碰撞,碰撞处理得很好。首先,被认为是连续或离散碰撞技术。当我读到这个理论时,我说它是离散的,但我在网上的文章中读到离散的主要缺点是它在实际发生碰撞后检测到碰撞。所以,我的问题是:它实际上是离散的吗?如果是这样的话,我看不出它有什么缺点吗?谢谢

  • 本章将介绍 Cocos Creator 的碰撞系统,目前 Cocos Creator 内置了一个简单易用的碰撞检测系统,支持 圆形,矩形 以及 多边形 相互间的碰撞检测。 下面会分成几个小节来介绍碰撞系统的细节内容。 编辑碰撞组件 碰撞分组管理 碰撞系统脚本控制 Collider 组件参考