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

libGDX-奇怪的碰撞行为

蒙麒
2023-03-14

我在libGDX中实现非常基本的碰撞有些困难。“播放器”的更新代码如下:

private void updatePosition(float _dt)
{
    Vector2 _oldPos = _pos;

    _pos.add(_mov.scl(_dt*50));
    _bounds.setPosition(_pos.x-8, _pos.y-12);

    if(_game.getMap().checkCollision(_bounds))
    {
        System.out.println("Collision Detected");
        _pos = _oldPos;
        _bounds.setPosition(_pos.x-8, _pos.y-12);
    }
}

因此,在应用任何移动之前,最初_oldPos存储为_pos位置向量的值。

然后通过将移动向量_mov(乘以增量时间* 50)加到位置向量来执行移动,然后将玩家的边界rectange _bounds更新到这个新位置。

在此之后,玩家的新边界矩形会根据游戏“地图”中的每个图块检查交叉点,如果检测到交叉点,玩家就不能向该方向移动,因此他们的位置会设置为以前的位置_oldPos边界矩形的位置也会设置为以前的位置。

那么这里发生了什么?我认为此代码应该解决检测到的冲突,这对吗?

奇怪的是,更换

_pos = _oldPos;

与(进行相同的移动只是反向进行)

_pos.sub(_mov.scl(_dt*50));

产生了非常不同的结果,玩家仍然可以通过固体块,但会遇到阻力。

这非常令人困惑,因为以下陈述应该是正确的:

_oldPos == _pos.sub(_mov.scl(_dt*50));

共有2个答案

吉栋
2023-03-14

尽量在移动前测试未来的位置。如果碰撞,不要移动。

李凯定
2023-03-14

碰撞检测的一个更好的解决方案是有一个Vector2速度,每一帧增加速度到位置。你可以有一个方法来测试向上箭头键是否被按下,增加1(或任何你想要的速度)到速度。如果按下了down,则减去1(或其他速度)。然后你可以在播放器上有4个碰撞矩形,1个在播放器的顶部,底部,左侧和右侧。你可以说< code>if(top碰撞边界){ if(velocity.y

并对下、左和右(例如…对于底部,确保测试if(velocity.y

编辑:您的代码不起作用,因为您设置了 oldPos = pos 而不实例化新的 Vector2。这意味着当您添加到pos上时,它也会更改旧Pos。所以说旧波斯= 新矢量2(位置);

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

  • 我一直在尝试在Libgdx中找到/创建矩形的碰撞检测,但似乎什么都做不到。我有一个叫bucket的矩形,宽度和高度为64,还有一个叫wall的矩形,宽度和高度为64。我试着让玩家不穿过矩形,可以在粘墙的同时继续移动,而不需要通过相位或随机传送。我的方法在有1个块的情况下有效,但当有多个块的时候,它就会中断,不起作用。 我知道这种方法很难看但这只是实验 如果有人能给我指出正确的方向或分享一些对我有帮

  • 我目前正在尝试使用java和libgdx制作一个突破性的克隆。我现在很难让球以合适的角度从挡块上弹起。简而言之,我遇到的问题是,球每帧移动12个像素,并不总是与砖的边缘对齐。如果有人对更好的移动球的方法或其他检查碰撞的方法有任何建议,我们将不胜感激! 主要游戏类 Ball类 砖块代码以防万一

  • 我正在为我的播放器和bullet类创建一些围绕精灵的矩形,以使用LibGDX的Intersector类中的重叠方法检测碰撞。 我有一个问题: 当我实例化Player和Bullet时,我使用sprite.getBoundingRectangle()在精灵周围创建一个边界框,它返回一个Rectangle对象。我在主类的其他地方更新这些的移动。 当我更新子弹/玩家精灵的移动时,我是否也需要更新子弹/玩家

  • 问题内容: Libgdx中是否可以验证多边形和圆之间的碰撞? 我看到了课程,但只发现了Circle和Rectangle的碰撞测试。那其他多边形呢? 如果我需要手动进行操作,那么使用Libgdx的最佳方法是什么? 问题答案: 因此,我设法在Circle和Polygon之间创建了碰撞测试方法。至少,它对我有用。 这是代码:

  • 我试图让我的游戏中的碰撞完全完美。我测试的是,如果你和玩家撞墙,你就会停下来。我只实现了当玩家撞墙左侧时(当墙在玩家右侧时)的碰撞代码。这是代码。 注意:如果我走得很慢,它会在我想要停止的地方停止玩家,但是走得很快,它不会按照我想要的方式进行碰撞 本质上,代码指出如果墙在右边,它将检查玩家矩形的右下角,减去墙的左下角,并检查两者之间的距离是否0.001. 0.001几乎是一个不明显的距离,因此我使