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.
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
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
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. –