2

我正在 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);
} 

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

谢谢

4

2 回答 2

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 次迭代的位置历史来计算实际速度方向。

于 2012-09-07T19:20:01.110 回答
0

你有两个选择:

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

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

于 2012-09-07T18:06:04.820 回答