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 radiuslosgeht , erstelle ich einen Zufallswert von ~ 30px. Ich versetze dann das Ansichtsfenster centrein zufälliger Richtung um so viele Pixel.
Für jedes nachfolgende Update (zwischen dem Zeichnen auf den Bildschirm) verkleinere ich um radius10-20% und versetze das Ansichtsfenster um so viele Pixel von centreneuem. Anstatt jedoch einen zufälligen Winkel für diesen Versatz zu wählen, nehme ich stattdessen den vorherigen Ansichtsfensterwinkel von centreund 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 centreBildschirm.
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 .