[英]Collision response 2d
問題: 問題http://img684.imageshack.us/img684/5486/prob1b.png 問題http://img810.imageshack.us/img810/3157/prob3.png 綠色方塊是播放器,灰色方塊是靜態的磚
當跳到瓷磚上時,如果玩家站在碰撞瓷磚的邊緣附近,則將其向左/向右推。 發生這種情況的原因可能是,向上的跳躍速度大於x方向的運動速度(甚至可能為0),因此玩家在x軸上得到了校正。
偽代碼如下所示:
{
//以下是一些其他偽代碼,這些偽代碼不應成為問題的一部分:
}
一些代碼:
foreach (Stone stone in collidingStones)
{
#region Collision Response
if (DrawRect.Intersects(stone.CollisionRect)) // DrawRect is the players collision rectangle
{
//warning bug is in this if-statement. causes the player to be adjusted and go trough neighboar tiles and such
Vector2 correction = Collision.CalculateMinimumTranslationDistance(DrawRect, stone.CollisionRect);
if (Math.Abs(correction.X) > Math.Abs(correction.Y))
{
Location += new Vector2(correction.X, 0);
}
else
{
Location += new Vector2(0, correction.Y);
}
有趣的問題是,幾年前,我在Delphi開發游戲,但遇到了同樣的問題。 要點:
最后,我制作了一個引擎,其中每個圖塊都有位圖 (實際的可見圖形),我稱之為freemap ,這是一個黑白位圖,表示圖塊中的可用空間圖。 然后,我編寫了碰撞函數,該函數首先在圖塊空間中運行(以確定與播放器碰撞的圖塊),然后在圖塊的位圖中運行。
移動播放器時,您需要根據播放器速度來計算下一個點,然后沿着當前位置和計算出的下一個位置之間的直線測試每個點。 如果您在那條線上遇到障礙,那么您將在該位置停止播放器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.