Se ti riferisci a quel tremolio dello schermo da un'esplosione, ho cercato di implementarlo nel mio prototipo di gioco (è 2d ma dovrei tradurre abbastanza bene in 3d, mi aspetto). Dai un'occhiata al video di YouTube e vedi se è quello che stai cercando: lo scuotimento dello schermo inizia all'incirca all'1: 35
Ad ogni modo, il modo in cui l'ho raggiunto è stato quello di creare un viewport per lo schermo e memorizzare il punto centrale ( centre
).
Quando inizia un'esplosione, creo un casuale radius
di ~ 30px. Ho quindi spostato il viewport centre
da questi pixel in una direzione casuale.
Per ogni aggiornamento successivo (tra i disegni sullo schermo), riduco radius
del 10-20% e compenso di nuovo il viewport di questi pixel centre
. Tuttavia, invece di scegliere un angolo casuale per questo offset, prendo invece l'angolo della vista precedente centre
e vi ho aggiunto 180 +/- 60 gradi.
Quindi, sostanzialmente, ogni aggiornamento (o circa 10-20ms) compenso il viewport di un numero decrescente di pixel rispetto centre
allo schermo.
Ecco alcuni pseudocodici:
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
}
Di solito interrompo il tremolio dello schermo quando il raggio scende al di sotto di 2.0, a quel punto ripristino il viewport centre
.