Wenn Sie sich auf diese ruckelnde Bildschirmerschütterung aus einer Explosion beziehen, habe ich versucht, dies in meinem Prototyp-Spiel zu implementieren (es ist 2D, sollte aber, wie ich erwarte, recht gut in 3D übersetzt werden). Schauen Sie sich das Youtube-Video an und sehen Sie, ob Sie danach suchen - der Screen Shake startet gegen 1:35
Wie auch immer, ich habe es geschafft, ein Ansichtsfenster für den Bildschirm zu erstellen und den Mittelpunkt zu speichern ( centre
).
Wenn eine Explosion radius
losgeht , erstelle ich einen Zufallswert von ~ 30px. Ich versetze dann das Ansichtsfenster centre
in zufälliger Richtung um so viele Pixel.
Für jedes nachfolgende Update (zwischen dem Zeichnen auf den Bildschirm) verkleinere ich um radius
10-20% und versetze das Ansichtsfenster um so viele Pixel von centre
neuem. Anstatt jedoch einen zufälligen Winkel für diesen Versatz zu wählen, nehme ich stattdessen den vorherigen Ansichtsfensterwinkel von centre
und füge 180 +/- 60 Grad hinzu.
Im Grunde genommen versetze ich das Ansichtsfenster bei jedem Update (oder 10-20 ms oder so) um eine abnehmende Anzahl von Pixeln vom centre
Bildschirm.
Hier ist ein 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
}
Normalerweise beende ich die Bildschirmschüttelung, wenn der Radius unter 2,0 sinkt centre
. An diesem Punkt setze ich das Ansichtsfenster zurück auf .