Si vous vous référez à ce tremblement d’écran tremblant provoqué par une explosion, j’ai essayé de l’implémenter dans mon prototype de jeu (c’est 2d mais devrait se traduire très bien en 3D, je l’espère). Regardez la vidéo sur youtube et voyez si c'est ce que vous cherchez - le tremblement de l'écran démarre environ à 1:35
Quoi qu’il en soit, j’ai réussi à créer une fenêtre pour l’écran et à stocker le point central ( centre
).
Quand une explosion se déclenche, je crée un radius
échantillon aléatoire de ~ 30 pixels. Je décale ensuite la fenêtre de centre
ce nombre de pixels dans une direction aléatoire.
Pour chaque mise à jour ultérieure (entre les tirages à l'écran), je réduis radius
de 10 à 20% et décale la vue de ce nombre de pixels à centre
nouveau. Cependant, au lieu de choisir un angle aléatoire pour ce décalage, je prends l'angle précédent dans la fenêtre d'affichage centre
et lui ajoute 180 +/- 60 degrés.
Donc, fondamentalement, chaque mise à jour (ou 10-20ms environ), je décale la fenêtre d'affichage d'un nombre décroissant de pixels à partir centre
de l'écran.
Voici quelques pseudocodes:
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
}
J'arrête habituellement le tremblement de l'écran lorsque le rayon est inférieur à 2,0, point auquel je réinitialise à nouveau la fenêtre d'affichage centre
.