2016-04-26 54 views
0

我正在寫一個俄羅斯方塊克隆,幾乎完成,除了碰撞。例如爲了移動件Z I使用方法:沒有陣列的俄羅斯方塊旋轉

void PieceZ::movePieceDown() 
{ 
    drawBlock (x1,y1++); 
    drawBlock (x2,y2++); 
    drawBlock (x3,y3++); 
    drawBlock (x4,y4++); 
} 

,並以旋轉一塊我使用一個設置(因爲座標是私有的)。對於旋轉我使用90度順時針旋轉矩陣。例如,如果我想移動(X1,Y1)(x2,y2)是我的原點,得到一個新塊的X和Y:

newX = (y1-y2) + x2; 
newY = (x2-x1) + y2 + 1; 

這一工程在一定程度上,它開始爲:

0 0 0 0 
0 1 1 0 
0 0 1 1 
0 0 0 0 

然後按計劃它旋轉到:

0 0 0 1 
0 0 1 1 
0 0 1 0 
0 0 0 0 

然後它旋轉到片S:

0 0 0 0 
0 0 1 1 
0 1 1 0 
0 0 0 0 

然後它只是在第二和第三階段之間交替。

我的計算是錯誤的,但我無法弄清楚在哪裏,我只需要一點提示。

+0

要驗證轉換是否正確,請旋轉原點塊本身。結果應該是塊不移動。你的情況'newX'仍然是'x2',但'newY'變成'y2 + 1',而不是'y2'。 – Dialecticus

+0

另外,不同的座標不應該存在於同一個表達式中。既然你正在旋轉一個片段,那麼所有影響'x'座標的值都必須是'y'類型,而影響'y'的所有值本質上都必須是'x'。 – Dialecticus

+0

在計算之後,但在計算之前,更新了用作原點的塊,,因此並非所有塊都使用相同的原點座標。您應該保存一份的副本,該副本在整個變換計算過程中保持一致。 –

回答

0

確定這裏是它應該怎麼走(有點):

  • 確定要旋轉件(這可能是上或下角或中心),並將其命名爲origin
  • 計算新的X newX = y - origin.y;
  • 計算新的y newY = -x + origin.x;

這應該工作(我有這個想法來自維基百科和旋轉矩陣:https://en.wikipedia.org/wiki/Transformation_matrix

+0

非常感謝您的時間!很明顯,數學表達式是正確的,但它們不適用於我。正如** ChristopherOicles **提到的那樣,這可能是因爲我的起源價值總是在變化,因爲我正在實施它。但修復它並不能解決它。我想我必須玩座標來弄清楚。 –