我有一個精靈,Player
。我更新Player
的位置通過以下方式:XNA/Monogame:平臺遊戲跳躍物理和對撞問題
_position += (_direction * _velocity) * (float)gameTime.ElapsedGameTime.TotalSeconds;
凡_position
,_direction
和_velocity
是Vector2
秒。
我有一個簡單的對撞機(BoxCollider
),它只是生成一個矩形(BoundingBox
)給定的對撞機的位置和尺寸。
在Initialize()
中,我創建了一個新的List<BoxCollider>
並填充了關卡的碰撞體。
在Update()
上,我將該列表傳遞給Player
以檢查衝突。
碰撞檢查方法:
public void CheckPlatformCollision(List<BoxCollider> colliders, GameTime gameTime)
{
var nextPosition = _position + (_direction * _velocity) * (float)gameTime.ElapsedGameTime.TotalSeconds;
Rectangle playerCollider = new Rectangle((int)nextPosition.X, (int)nextPosition.Y, BoundingBox.Width, BoundingBox.Height);
foreach(BoxCollider collider in colliders)
{
if(playerCollider.Intersects(collider.BoundingBox))
{
nextPosition = _position;
}
}
Position = nextPosition;
}
現在,每次我試圖執行重力的方式失敗。如果Player
從太高的位置下降,nextPosition
離Player
太遠,並使其卡在空中。
我也遇到了水平碰撞的問題,問題相似:Player
停止得太快,在它們之間留下一個空格。有時候我已經把Player
貼在對撞機的一側。
我想知道的是:
如何正確執行重力&與_position
,_direction
,並且_velocity
跳?我如何正確處理水平和垂直碰撞?
也許這會幫助你:http://gamedev.stackexchange.com/questions/104954/2d-collision-detection-xna-c – vyrp