2016-04-26 9 views
0

Ich schreibe einen Tetris Clone, es ist fast fertig, außer für die Kollisionen. Beispielsweise um das Stück zu bewegen Z verwende ich eine Methode:Tetris Rotation ohne Arrays

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

und um ein Stück verwende ich eine setter zu drehen (da Koordinaten privat ist). Zur Rotation verwende ich eine um 90 Grad im Uhrzeigersinn drehende Matrix. Zum Beispiel, wenn ich (x1, y1) und (x2, y2) ist mein Ursprung, erhalten x und y eines neuen Blocks bewegen:

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

, das funktioniert zu einem gewissen Grad, es beginnt als:

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

dann wird, wie es geplant dreht:

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

Und dann dreht es Piece S:

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

Und dann wechselt es einfach zwischen der zweiten und der dritten Stufe.

Meine Berechnungen sind falsch, aber ich kann nicht herausfinden, wo, ich brauche nur einen kleinen Hinweis.

+0

Um zu überprüfen, ob die Transformation korrekt ist, rotieren Sie den Ursprungsblock selbst. Das Ergebnis sollte sein, dass sich der Block nicht bewegt. In Ihrem Fall bleibt 'newX'' x2', aber 'newY' wird' y2 + 1', anstatt 'y2' zu bleiben. – Dialecticus

+0

Auch andere Koordinaten sollten nicht im selben Ausdruck existieren. Da du ein Stück drehst, müssen alle Werte, die 'x' coord betreffen, von" y "sein und alle, die" y "betreffen, müssen" x "sein. – Dialecticus

+0

Der Block, den Sie als Ursprung verwenden, wird aktualisiert, nachdem Sie berechnet haben, aber bevor Sie und berechnen, so verwenden nicht alle Blöcke die gleichen Ursprungskoordinaten. Sie sollten eine Kopie von speichern, die während der gesamten Transformationsberechnung konsistent bleibt. –

Antwort

0

Ok hier ist, wie es gehen soll (etwas):

  • Bestimmen Sie, wo Sie das Stück gedreht werden sollen (dies ist die obere oder untere Ecke oder das Zentrum sein könnte) und es origin
  • berechnen rufen die neue x newX = y - origin.y;
  • Berechnen der neuen y newY = -x + origin.x;

Diese Arbeit sollte (ich diese Idee von wikipedia und Rotation Matrizes bekam: https://en.wikipedia.org/wiki/Transformation_matrix)

+0

Vielen Dank für Ihre Zeit! Es ist klar, dass mathematische Ausdrücke korrekt sind, aber sie funktionieren nicht für mich. Wie ** ChristopherOicles ** erwähnt, liegt es wahrscheinlich daran, dass sich mein Ursprungswert immer ändert, weil ich ihn umsetze. Aber es zu reparieren, repariert es überhaupt nicht. Ich denke, ich muss mit Koordinaten spielen, um es herauszufinden. –