Si les matrices de rotation classiques fonctionnent, cela dépendra du rotation system que vous souhaitez utiliser. Je vais utiliser SRS comme exemple.
La matrice de rotation pour la rotation dans le sens antihoraire autour de l'origine est:
[0 -1]
[1 0]
Maintenant, supposons que vous avez une liste de coordonnées [(0, 1), (1, 1), (2, 1), (3, 1)] représentant la I-bloc dans sa position initiale:
0....
1####
2....
3....
Notez que je ne pas utiliser un système de coordonnées cartésiennes, mais les coordonnées d'écran habituels, en commençant en haut à gauche. Pour faire pivoter le bloc correctement, vous devez d'abord prendre en compte le retournement de l'axe y. La matrice de rotation devient alors:
[ 0 1] -> x_new = y_old
[-1 0] -> y_new = -x_old
Ensuite, pour tourner autour d'un point de pivot, avant de tourner, il faut décaler les coordonnées de sorte que le point de pivot devient l'origine (appelé sb
ci-dessous) et les déplacer en arrière après une rotation (appelé sa
ci-dessous):
x_new = sa_x + (y_old - sb_x)
y_new = sa_y - (x_old - sb_y)
Normalement, on aurait sb = sa
, mais pour des blocs de tetris le point de pivot est parfois sur la grille entre les deux cellules (pour I et O-blocs) et parfois à la centre d'une cellule (pour tous les autres blocs).
Il se trouve que
sa_x = 0
sb_x = 0
sa_y = 1
sb_y = me - 2
où me
est l'étendue maximale (à savoir 2, 3 ou 4) du bloc de rotation, qui fonctionne pour tous les blocs.Donc, pour résumer, vous obtenez:
x_new = y_old
y_new = 1 - (x_old - (me - 2))
rotation Contraire est similaire, mais si vous mettez en cache les coordonnées pour toutes les orientations pour de bloc, vous aurez seulement besoin d'une direction. Pour d'autres systèmes de rotation, d'autres valeurs des variables de décalage peuvent fonctionner, mais vous devrez peut-être déplacer de nouveau la pièce, en fonction de l'orientation actuelle du bloc (comparez SRS rotation à DTET rotation du bloc I, pour voir ce que je signifier).
En outre, toute rotation « appropriée » aura du mal à localiser les blocs sur les limites de la grille appropriée. Pour un ensemble typique de pièces Tetris, je devrais coder en dur les 4 rotations pour chacune des pièces. – Kylotan
Ou, si vous devez le faire de manière procédurale, vous pouvez obtenir des rotations à angle droit grâce à de simples échanges et négations sur les coordonnées x, y - faites le sur papier et vous verrez que c'est facile. – Crashworks
Faites également attention aux rotations qui se produisent lorsque la pièce est sur le bord de la planche. Dans certaines circonstances, vous devrez replacer la pièce dans la table. +1 pour le codage en dur, ainsi que pour l'algorithme. – Flavius