阻止碰撞运动

我正在XNA开发一款2D游戏,而且我正在研究我的物理课。 我当前的任务是在物体与另一物体相撞时停止物体。 当两个物体发生碰撞时,我让我的游戏调用此function:

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); } 

问题是,而不是停止。 正在移动的物体被它的宽度推回。 谁能请出示/告诉我如何做到这一点我在很多项目中一直坚持这一点。

谢谢

您没有将目标和所有者的宽度和高度计算在内。 目标/所有者的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次迭代的位置历史记录来计算实际速度方向。

你有两个选择:

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 

这都是伪代码所以不要把代码视为文字。