2013-02-02 70 views
1

我正在C++中爲一個簡單的基於磁貼的平臺實現一些非常基礎的平臺物理。我在這裏遵循這個算法(https://gamedev.stackexchange.com/questions/18302/2d-platformer-collisions),正如我所能做的那樣,但我仍然在玩家在瓦片上彈跳時出現奇怪的故障。我不確定發生了什麼事。該代碼是在C++中使用SDL平臺化物理彈跳故障C++

void Player::update(vector< vector<Tile> > map) { 
vector<Tile> collidingTiles; 

x += xVel; 
y += yVel; 

boundingBox = Rect(x,y,16,16); 

for(int iy=0;iy<MAPH;iy++) { 
    for(int ix=0;ix<MAPW;ix++) { 
     if (map[ix][iy].solid == true) { 
      if (boundingBox.collide(map[ix][iy].boundingBox)) { 
       collidingTiles.push_back(map[ix][iy]); // store all colliding tiles, will be used later 
       Rect intersectingRect = map[ix][iy].boundingBox; // copy the intersecting rect 
       float xOffset = x-intersectingRect.x; // calculate x-axis offset 
       float yOffset = y-intersectingRect.y; //calculate y-axis offset 
       if (abs(xOffset) < abs(yOffset)) { 
        x += xOffset; 
       } 
       else if (abs(xOffset) > abs(yOffset)) { 
        y += yOffset; 
       } 
       boundingBox = Rect(x,y,16,16); // reset bounding box 
       yVel = 0; 
      } 
     } 
    } 
} 
if (collidingTiles.size() == 0) { 
    yVel += gravity; 
} 
}; 
+1

什麼是毛刺? –

回答

0
if (abs(xOffset) < abs(yOffset)) { 
    x += xOffset; 
} 
else if (abs(xOffset) > abs(yOffset)) { 
    y += yOffset; 
} 
yVel = 0; 

在這段代碼,如果abs(xOffset) == abs(yOffset),沒有任何反應,這意味着玩家可以進入斜了堅實的磚。如果算法必須做出選擇,則移除第二個測試應該刪除問題並修改y另外,我想知道是否真的想要在發生水平碰撞時重置垂直速度。這也意味着如果碰撞是水平的,重力仍然適用(否則牆壁和天花板會變粘)。

int gravityApplies = true;//fix 2a 

... 

    if (abs(xOffset) < abs(yOffset)) { 
     x += xOffset; 
     xVel = 0;  //fix 2 
    } 
    else {    //fix 1 
     y += yOffset; 
     yVel = 0;  //fix 2 
     if(yOfsset < 0){ // fix 2a 
      gravityApplies = false; 
     } 
    } 

... 

if (gravityApplies) { //fix 2a 
    yVel += gravity; 
} 

如果你想彈性碰撞,使用yVel = -yVel代替yVel = 0(以及其他方向類似)。你甚至可以做yVel = yVel * rest其中rest範圍從-10-0.8是一個不錯的選擇)來獲得半彈性碰撞。

+0

謝謝你的引力修復,但彈跳的問題仍然存在,即使我把其他if語句改爲其他簡單的方法 –

+0

@MattRelle你能描述一下你的問題嗎?修復#1是爲了防止嵌入到圖塊中。 –

+0

你想要彈性碰撞而不是非彈性碰撞嗎? –