【问题标题】:libGDX - Strange Collision BehaviourlibGDX - 奇怪的碰撞行为
【发布时间】:2016-07-13 15:19:13
【问题描述】:

我在 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(乘以delta-time * 50)到位置向量来执行移动,然后更新玩家的边界矩形_bounds到这个新位置。

在此之后,玩家的新边界矩形会检查与游戏“地图”中每个图块的交叉点,如果检测到交叉点,则玩家无法朝该方向移动,因此将其位置设置为之前的位置 _oldPos,并且边界矩形的位置也设置为之前的位置。

不幸的是,这不起作用,玩家可以直接穿过瓷砖,如下图所示:

那么这里发生了什么?我认为这段代码应该解决检测到的冲突是否正确?

奇怪的是,替换

_pos = _oldPos;

with(做同样的动作,只是反过来)

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

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

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

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

【问题讨论】:

    标签: java android libgdx collision-detection


    【解决方案1】:

    在移动之前尝试测试未来的位置。如果发生碰撞,请不要移动。

    【讨论】:

    • 结果一模一样,可惜:image
    【解决方案2】:

    更好的碰撞检测解决方案是使用 Vector2 速度,并且每一帧都会将速度添加到位置。您可以有一个方法来测试是否按下了向上箭头键,将 1(或您想要的任何速度)添加到速度。如果按下向下,则减去 1(或任何速度)。然后你可以在播放器上有 4 个碰撞矩形,1 个在播放器顶部、底部、左侧和右侧。你可以说 if(top collides with bounds){ if(velocity.y > 0){ set velocity.y = 0. } }

    并且对下、左和右执行相同的操作(例如...对于底部,请确保测试 if(velocity.y 0)。

    编辑:您的代码无法正常工作,因为您设置了 oldPos = pos 而没有实例化一个新的 Vector2。这意味着当您添加到 pos 时,它也会更改 oldPos。所以说 oldPos = new Vector2(pos);

    【讨论】:

    • 这就是问题所在!谢谢。因此,如果我将一个变量设置为另一个变量,它会实时“跟踪”它吗?
    • @W.H 是的,当您将一个对象设置为等于另一个而不使用 new 时,它指向与您设置它相等的对象相同的内存。这意味着两个对象都是指向相同数据的指针。
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多