2016-11-29 87 views
1

這是我第一個更大的編程項目,所以我幾乎是一個初學者,他遇到了一個問題,這個問題讓我現在幾周感到困惑。也許有人可以幫忙。 :)當與一個矩形的邊緣碰撞時,球會跳躍

我正在構建一個簡單的2D遊戲。您可以通過俯仰和偏航智能手機來控制球。每當球碰到矩形障礙物的確切邊緣時,它首先陷入它,然後隨機跳出。當障礙物建立一條直線時,它不會發生。

經過一段時間的調試,我很確定這個錯誤必須存在於遊戲物理部分的某個地方。這裏是代碼:

 float var = gameView.screenSize()/2; 
    // If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) { 
     if(playerSpeedX > 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.left - var; playerSpeedX = -playerSpeedX;} // left 
     if(playerSpeedX < 0 && playerX > r.left - var && playerX < r.right + var && playerY >= r.top && playerY <= r.bottom) { playerX = r.right + var; playerSpeedX = -playerSpeedX;} // right 
     if(playerSpeedY > 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.top - var; playerSpeedY = -playerSpeedY;} // top 
     if(playerSpeedY < 0 && playerY > r.top - var && playerY < r.bottom + var && playerX >= r.left && playerX <= r.right) { playerY = r.bottom + var; playerSpeedY = -playerSpeed;} //bottom 
    } 

var描述了障礙物的一半大小。

也許有人可以幫助我。提前致謝。 :)

+0

如果障礙物是*矩形* *單個*值「*障礙物大小的一半*」是什麼意思?一個維度只適用於* square *(一個相當特殊的矩形)。 – Clifford

+0

你確定你不是指「*球大小的一半*」,這似乎更可能給出代碼。 – Clifford

+0

應該沒關係,遊戲區被劃分爲16:9的網格,所以球和障礙物的網格大小相同。是的,障礙都是正方形,對不起。 –

回答

0

如果有必要的信息,我已經做了一些假設,並提出了更好的理解和調試能力的代碼。這可以幫助你自己解決問題,但無論如何,如果要求他人協助,玩具應該如何提出這個問題。只是爲了清楚起見一個條件if塊,其他人可能會遵循相同的模式:

// If the player touches the barrier, its speed will invert 
    for(RectF r : barrier) 
    { 
     if(playerSpeedX > 0 &&     // If moving right and ... 
      playerX > r.left - var &&   // ... ball edge past left of r and 
      playerX < r.right + var &&   // ... ball edge not past right of r and 
      playerY >= r.top &&     // ... ball centre below top of r and 
      playerY <= r.bottom)     // ... ball centre above top of r 
     { 
      playerX = r.left - var;   // Move ball to the left 
      playerSpeedX = -playerSpeedX; // Change motion direction 
     } 

     ... 
    } 

我不能肯定這些假設是正確的,但建議或許第二和第三布爾子表達式在有條件的威力從>更改爲>=,那麼\\Move ball to the left聲明就不必要了。

除了清晰和明確地評論每個子表達式的目的的能力之外,以這種方式佈置代碼的優點是當在面向行的源代碼級調試器中執行代碼時,可以驗證行爲每個子表達式和語句都是獨立的,而不是讓所有事情都立即發生,並且不知道爲什麼(或者至少不那麼明顯)。在任何情況下,使用debugger都是更有效的方法來解決發佈問題,例如在SO上發佈問題。