2011-12-21 120 views
3

我目前在使用邊界框使一個精靈出現固體時遇到了麻煩。下面的代碼碰撞工作得很好。二維邊界框碰撞,牆壁

位置是地圖上的主要角色位置。 character2是主角色將與其碰撞的18 x 28精靈的名稱。

當主角色與角色2精靈發生碰撞時,我試着相應調整位置(EX:Position.X - = 1;),但這只是將我的主精靈滑回,直到它不相交。

我有一種感覺,這是非常簡單的事情,但對於我的生活,我只是無法弄清楚。

總結我的問題:如何使character2 sprite在碰撞時顯示爲實體?另外,即使我的主精靈在碰撞時停下來(通過將速度降低到0)它會卡在那裏,if語句進入一個無限循環。

 float x1 = Position.X; 
     float y1 = Position.Y; 

     float x2 = x1 + character2.Width; 
     float y2 = y1 + character2.Height; 

     BoundingBox b1 = new BoundingBox(new Vector3(x1, y1, 0), 
      new Vector3(x2, y2, 0)); 
     BoundingBox b2 = new BoundingBox(new Vector3(Position2.X, Position2.Y, 0), 
      new Vector3(x2, y2, 0)); 


     if (Collision(b1, b2)) 
     { 
      // ???? 
     } 

回答

1

這取決於你想確切地發生什麼,但一個建議是這樣的......

if (HorizontalCollision(b1, b2)) 
    { 
    xv = -xv; 
    } 
    else if (VerticalCollision(b1, b2)) 
    { 
    yv = -yv; 
    } 

    Position2.X += xv; 
    Position2.Y += yv; 

xvyv會在這種情況下,速度變量和你只是倒車它們的方向分別是在發生水平或垂直碰撞時。這會導致物體或角色從彼此的字面上反彈。

然後,您可以添加xv *= .99yv *= .99以使速度在每個渲染循環後減慢,模擬動量和摩擦。當你使用像這樣的速度變量時,許多不同的可能性開啓。順便說一句,這叫做Euler integration,對於動畫的目的來說效率非常高。

0
While(Collision(b1, b2)) 
{ 
    Position.X -=1; 
} 

這就是你想要的嗎? :P

+0

這只是凍結屏幕= X – 2011-12-21 03:15:00