我正在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);
}
问题在于不是停止。正在移动的物体被它的宽度推回。 有人可以出示/告诉我如何做到这一点我在很多项目中都被困在这一点上。
感谢
答案 0 :(得分: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次迭代的位置历史来计算实际的速度方向。
答案 1 :(得分: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
这都是伪代码,所以不要将代码视为文字。