Cara memutar balok di tetris

17

Saya memiliki kotak gameboard yang tingginya 20 baris dan lebar 10 kolom dengan titik asal (0,0) berada di sudut kiri atas. Saya memiliki tetrimino dalam permainan, yang terdiri dari empat blok. Saya memiliki lokasi x, y dari setiap blok relatif terhadap asal sudut kiri atas. Saya juga memiliki posisi pivot, titik di mana saya ingin memutar yang relatif terhadap asal sudut kiri atas.

Setiap blok memiliki posisi bilangan bulat dalam kotak gameboard dan karenanya pivot memiliki posisi fraksional di antara blok misalnya (10,5,10,5)

Pertanyaan saya adalah: Formula manakah yang dapat saya gunakan untuk memutar setiap blok di sekitar pivot?

Saya sudah melihat pertanyaan dan jawaban serupa yang sudah ada tetapi tidak bisa menemukan jawaban yang bisa saya peroleh.

Bantuan akan sangat dihargai.


sumber
milik game dev.
dan jika ini di sini ... tunjukkan kepada kami beberapa struktur data
Jika Anda hanya memutar dengan beberapa sudut kanan, maka ini seharusnya cukup mendasar. Hanya menggambar beberapa diagram, dan Anda harus bisa mengetahui solusi integer.
Kerrek SB
3
Saya tidak akan repot-repot menghitung rotasi, cukup letakkan keempat versi yang mungkin diputar dalam sebuah array.
fredoverflow
1
Saya juga menyarankan apa yang dikatakan @FredOverflow. Jika Anda melihat pertanyaan saya (yang mirip dengan pertanyaan Anda), Anda lihat bagaimana saya menyimpan satu blok untuk implementasi saya.
bummzack

Jawaban:

22

Logika rotasi Tetris standar disebut Sistem Super Rotasi. SRS cocok untuk permainan Tetris tingkat tinggi, memungkinkan banyak variasi pada tendangan dinding dan t-spin.

Semua tetromino ada di dalam kotak pembatas dan berputar di sekitar pusat kotak ini kecuali terhalang. Tetromino dengan lebar 3 (J, L, S, T, Z) ditempatkan di dua baris teratas dari bujur sangkar dan (untuk J, L, dan T) dengan sisi rata di bawah. Saya ditempatkan di baris tengah atas.

Semua tetromino bertelur dalam 2 baris yang biasanya tersembunyi di bagian atas lapangan bermain. Mereka ditempatkan di tengah-tengah barisan ini, membulat ke kiri. Setelah tetromino mendarat, tetromino tidak akan terkunci sampai penundaan kunci berakhir. Perilaku penundaan kunci, yang disebut Infinity oleh Perusahaan Tetris, mengatur ulang penundaan kunci setiap kali tetromino dipindahkan atau diputar. Hard drop umumnya dipetakan ke atas, yang tidak memiliki penundaan kunci.

Tetromino dalam kotak pembatas rotasi mereka.

Ada varian umum lainnya yang disebut ARS, yang digunakan dalam game Tetris Arika : The Grand Master .


sumber
7

Rumus umum untuk memutar sekitar asal adalah

xNew = x * cos(a) - y * sin(a)
yNew = x * sin(a) + y * cos(a)

Untuk 90 derajat menjadi

xNew = -y
yNew = x

Jadi, pertama-tama dapatkan koordinat pusat batu bata relatif ke titik pivot:

x = xBrickCenter - xPivot
y = yBrickCenter - yPivot

Kemudian putar di sekitar titik pivot:

x1 = -y = yPivot - yBrickCenter
y1 = x = xBrickCenter - xPivot

Dan kemudian tambahkan koordinat pivot ke titik yang diputar:

newXBrickCenter = xPivot + x1 = xPivot + yPivot - yBrickCenter
newYBrickCenter = yPivot + y1 = yPivot - xPivot + xBrickCenter

Tetapi jika Anda perlu memutar dengan kelipatan 90 derajat, Anda dapat menyimpan empat set posisi bata untuk setiap orientasi dan beralih di antara mereka bukannya benar-benar berputar.

breakp01nt
sumber
0

Anda dapat memutar semua cincin persegi (a-through-h dengan 2 posisi, A-through-P dengan 4 posisi, dan seterusnya) di sekitar blok pivot:

ABCDE MNOPA
PabcF LghaB
Oh.dG -> Kf.bC
NgfeH JedcD
MLKJI IHGFE
Alexey Frunze
sumber