我正在寫一個俄羅斯方塊克隆,幾乎完成,除了碰撞。例如爲了移動件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
然後它只是在第二和第三階段之間交替。
我的計算是錯誤的,但我無法弄清楚在哪裏,我只需要一點提示。
要驗證轉換是否正確,請旋轉原點塊本身。結果應該是塊不移動。你的情況'newX'仍然是'x2',但'newY'變成'y2 + 1',而不是'y2'。 – Dialecticus
另外,不同的座標不應該存在於同一個表達式中。既然你正在旋轉一個片段,那麼所有影響'x'座標的值都必須是'y'類型,而影響'y'的所有值本質上都必須是'x'。 – Dialecticus
在計算之後,但在計算和之前,更新了用作原點的塊,,因此並非所有塊都使用相同的原點座標。您應該保存一份的副本,該副本在整個變換計算過程中保持一致。 –