Jika Anda mengacu pada guncangan layar yang menilai dari sebuah ledakan, saya telah mencoba menerapkan ini dalam permainan prototipe saya (ini 2d tetapi harus diterjemahkan ke 3d dengan cukup baik, saya harapkan). Lihatlah video youtube dan lihat apakah itu yang Anda cari - guncangan layar dimulai sekitar 1:35
Bagaimanapun, cara saya mencapainya adalah membuat viewport untuk sceen dan menyimpan titik pusat ( centre
).
Ketika sebuah ledakan dimulai, saya membuat acak radius
~ 30px. Saya kemudian mengimbangi viewport dari centre
ini dengan banyak piksel dalam arah acak.
Untuk setiap pembaruan berikutnya (antara menarik ke layar), saya mengurangi radius
10-20% dan mengimbangi viewport dengan banyak piksel dari ini centre
lagi. Namun, alih-alih memilih sudut acak untuk offset ini, saya malah mengambil sudut viewport sebelumnya dari centre
dan menambahkan 180 +/- 60 derajat ke sana.
Jadi pada dasarnya, setiap pembaruan (atau 10-20 ms atau lebih), saya mengimbangi viewport dengan berkurangnya jumlah piksel dari centre
layar.
Inilah beberapa pseudocode:
viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()
while(true) //update about every 10-20ms
{
radius *=0.9 //diminish radius each frame
randomAngle +=(180 +\- rand()%60) //pick new angle
offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) //set centre of viewport
draw() //redraw
}
Saya biasanya menghentikan guncangan layar ketika jari-jari lebih rendah dari 2.0, pada saat itu saya mengatur ulang viewport kembali ke centre
.