【问题标题】:Blocking Movement On Collision碰撞时阻止运动
【发布时间】:2012-09-01 11:51:44
【问题描述】:

我正在 XNA 中开发一个 2d 游戏,我目前正在学习我的物理课。我目前的任务是在一个物体与另一个物体碰撞时停止它。 当两个物体发生碰撞时,我已经让我的游戏调用这个函数:

public void BlockMovement(gameObject target) {
    //you can call width by just typing width. same for height
    owner.position.X += (owner.position.X - target.position.X);
    owner.position.Y += (owner.position.Y - target.position.Y);
} 

问题在于,而不是停止。移动的物体被推回它的宽度。 有人可以告诉我/告诉我如何做到这一点,我在许多项目中已经坚持了很长时间。

谢谢

【问题讨论】:

  • 您是否在其他地方进行碰撞检查?如果你想停下来,为什么不把速度归零呢?如果没有看到您的游戏对象详细信息或至少您如何更新位置,很难说出如何让事情停止。
  • 是的,我不确定为什么在 BlockMovement() 上您要尝试移动对象的 X 和 Y 位置。您可能希望它完全停止移动,除非您试图让它弹跳或其他什么。您是否有更多代码,以便我们更好地了解您需要更改的内容?

标签: c# xna physics blocking collision


【解决方案1】:

您没有将目标和所有者的宽度和高度计算在内。目标/所有者的 X、Y 在哪里?中间?左上角?

如果是正面碰撞,那么

velocity=sqrt(x_velocity*x_velocity+y_velocity*y_velocity); //some pseudo   

public void BlockMovement(gameObject target) {
    //you can call width by just typing width. same for height
    owner.position.X -=owner.x_velocity*penetration_length/(owner.velocity);
    owner.position.Y -=owner.y_velocity*penetration_length/(owner.velocity);
} 

//so, if big part of speed is in x-direction then the position will
//change mostly on x-direction and opposite to velocity

如果您没有速度变量,您可以引入 2 次迭代的位置历史来计算实际速度方向。

【讨论】:

    【解决方案2】:

    你有两个选择:

    1) 在移动之前预测碰撞并防止碰撞发生 要么 2) 移动,检测碰撞,然后相应地解决碰撞

    我的游戏使用方法 2 在物体与无法通过的图块碰撞时阻止它们。这样的过程如下所述。

    objectPreviousPosition = object.position
    object.move()
    if(object.isCollidingWith(wall))
        object.position = objectPreviousPosition
    

    这是非常基本的,并没有描述如何检测碰撞,只描述了当你的碰撞逻辑返回 true 时该怎么做。此外,如果玩家的更新导致碰撞,此方法将阻止任何和所有移动。因此,您将无法使用此方法实现沿墙壁的“滑动”效果。

    如果您愿意,为了实现滑动效果,您需要确定玩家的移动方向并通过根据该方向调整玩家的位置来解决碰撞。

    例如:

    if(object.movementDirection == movementDirection.UpRight)
        if(player colliding with wall to right)
            keep Y coordinate and set X coordinate to put player on left side of wall
    

    这都是伪代码,所以不要把代码当作文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多