Screenshake for Dummies

    • Studio

      Screenshake for Dummies

      Das folgende Tutorial ist eher als kleines Snippet zu verstehen und behandelt ein eigentlich ganz simples Thema: Screenshake bzw Explosions oder Erdbeben Effekt.

      Wer kennt das nicht in seinem Spiel explodiert was aber es wirkt nicht spektakulär genug, hier wurde zudem letztens ein Video gezeigt zur Aufpeppung von Spielen, dort war der Screenshake quasi ein muss!

      das Ganze lässt sich mit einem Objekt realisieren - wir legen jetzt los!

      1. erstelle ein Objekt ohne Sprite, dieses muss nicht platziert werden, es wird dynamisch erstellt nenne es shaker
      2. wir erstellen ein create Event in diesem Objekt:


      shaky = 0 // Wir sparen uns einen Timer und zählen stattdessen per step hoch

      3. erstelle ein Step Event mit folgendem Inhalt:

      shaky ++; // pro step ( Roomspeed) geht shaky einen nach oben ich gehe hier von RS = 30 aus
      view_xview = random_range (-2,2); // der view Effekt mit random Variable auf X
      view_yview = random_range (-2,2); // der view Effekt mit random Variable auf Y

      if (shaky == 75) // wenn shaky 75 erreicht hat wird der untere code ausgeführt
      {
      view_xview = 0; // shake wird auf 0 zurückgesetzt
      view_yview = 0;
      instance_destroy(); // Shaker zerstört sich selbst
      }

      4. wo immer nun deine Explosion stattfindet, erstellst du dieses Objekt mit folgendem code, oder per Instance Create Button ( Glühbirne)

      instance_create(x,y,shaker ); // shaker wird aufgerufen

      der Effekt verstärkt sich wenn wir statt random_range (-2,2) einfach (-5,5) nehmen usw


      wir könnten mit audio_play_sound( SOUND, 10, false) einen 5 sekunden langen Erdbeeben SOund, oder einen Explosionsound vor dem shake einfügen



      Ich hoffe ein paar von euch besonders ANfänger können damit etwas anfangen - das ganze habe ich eben getestet es sollte funktionieren wenn es probleme gibt stehe ich zur verfügung

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fuexline“ ()

      Zu Beachten ist, dass die Dauer des Screenshakes in deinem Code exakt 75 frames lang ist, was bei den standard 30fps einer Dauer von 2,5 Sekunden entspricht und bei 60fps spielen nur noch 1,25s lang wäre.

      Es wäre eleganter diese Parameter im Createvent zu definieren statt im Code fest zu verdrahten. Noch eleganter wäre es ein Script zu schreiben, bei dem man diese Paramter als Argumente mitgeben kann, sodass man situationsabhängig verschieden lange und/oder intensive Shake-Effekte ausführen kann.
      technisch gesehen stimme ich da zu aber ich wollte es so simpel wie möglich halten - der shake ist mit Absicht so krz z.B. für einen Treffer usw. natürlich könnte man den shaky Wert auch erhöhen um eben den Effekt zu verlängern

      wer damit Erfahrungen hat kann natürlich das ganze extern in ein Script auslagern
      Es ist nicht falsch ein Tutorial darüber zu machen. Allerdings habe ich ein paar Vorschläge zur Umsetzung:
      • Benutze die GML Tags, so musst du nicht Mühevoll deinen Code mit Farben ausschmücken. Einfach ein klick auf das weiße Quadrat, wo GML draufsteht.
      • Ein Tutorial ist keine Anleitung! Sag nicht was man tun muss, sondern warum man das tut. Das ist mir schon öfters bei dir aufgefallen.
      • Unter welchen Umständen kann man deine vorgestellte Methode benutzen. Erwähne hier konkret, dass ein View aktiviert sein muss. Zudem darf nach der jetzigen definition der View nicht beliebig verschoben werden, sondern wird immer zum Nullpunkt teleportiert. Das macht das ganze in einen Jump and Run, welcher größer als der Screen ist, schonmal nutzlos.
      Anonsten ist das Tutorial ganz nett.

      1. stimmt das ist mir mit dem CC Code auch erst aufgefallen als ich das Tutorial bereits abgesendet habe
      2. ich habe Comments drann gehangen diese sollten als Erklärung dienen
      3. stimmt da hast du du natürlich recht - ich werde die tage das ganze etwas ausarbeiten
      Noch besser, und das sollte eher in obj_gameplay, oder wie ihr auch immer nennt, gehören (statt jedes mal neues objekt erstellen + löschen):

      Create Event:

      GML-Quellcode

      1. global.shakeTime = 0;
      2. global.shakeStrength = 0;


      Step Event:

      GML-Quellcode

      1. var shakeX = 0, shakeY = 0;
      2. if (global.shakeTime >= 0){
      3. global.shakeTime--;
      4. shakeX = random_range(global.shakeStrength, -global.shakeStrength);
      5. shakeY = random_range(global.shakeStrength, -global.shakeStrength);
      6. }
      7. view_xview[0] = SomethingX + shakeX;
      8. view_yview[0] = SomethingY + shakeY;


      Jetzt kann man mit diesen Funktion aufrufen, um Shake zu aktivieren (was weiß ich, vllt. z.B. bei obj_player). Wichtig ist nur, das dieser Funktion einmal ausgeführt werden muss:

      GML-Quellcode

      1. global.shakeTime = room_speed*2 // 2 Sekunde Shake
      2. global.shakeStrength = 5; //Shake stärke


      Es ist viel besser, als jedesmal neue Instanz zu erstellen. ;) Natürlich kann man das ganzer noch verfeinern, das z.B. dann Shake immer schwächer wird statt direkt stoppen. Einfach die shakeX/shakeY immer schwächer lassen.
      Du kannst ruhig dieser Code nutzen/in Thread packen, wenn du willst.
      Ihr stinkt.
      ja so ähnlich habe ich es in meinem Projekt, mir ging es um das simple mach ein objekt ruf es auf Konzept, klar kann man es ausbauen und oder verfeinern - ist ja auch ne gute Sache ich sagte vorhin zu Husi das es bestimmt Anfänger geben wird die dann nen Mienenfeld bauen und dadurch 300 shaker createn und sich dann wundern wieso alles laggt unter html5 oder android xd
      ja das stimmt view 0 wird dafür genutzt das ist so der Standard

      ich bin wirklich vom Anfänger ausgegangen der setzt ne view 800 mal 600 plaziert blocks und hat ne Figur die läuft, Profis und Fortgeschrittene bauen das Ganze natürlich entsprechend um deshalb seh ich das auch eher als snippet anstatt als Tutorial an

      fuexline schrieb:

      Das folgende Tutorial ist eher als kleines Snippet zu verstehen und behandelt ein eigentlich ganz simples Thema: Screenshake bzw Explosions oder Erdbeben Effekt.

      Wer kennt das nicht in seinem Spiel explodiert was aber es wirkt nicht spektakulär genug, hier wurde zudem letztens ein Video gezeigt zur Aufpeppung von Spielen, dort war der Screenshake quasi ein muss!

      das Ganze lässt sich mit einem Objekt realisieren - wir legen jetzt los!

      1. erstelle ein Objekt ohne Sprite, dieses muss nicht platziert werden, es wird dynamisch erstellt nenne es shaker
      2. wir erstellen ein create Event in diesem Objekt:


      shaky = 0 // Wir sparen uns einen Timer und zählen stattdessen per step hoch

      3. erstelle ein Step Event mit folgendem Inhalt:

      shaky ++; // pro step ( Roomspeed) geht shaky einen nach oben ich gehe hier von RS = 30 aus
      view_xview = random_range (-2,2); // der view Effekt mit random Variable auf X
      view_yview = random_range (-2,2); // der view Effekt mit random Variable auf Y

      if (shaky == 75) // wenn shaky 75 erreicht hat wird der untere code ausgeführt
      {
      view_xview = 0; // shake wird auf 0 zurückgesetzt
      view_yview = 0;
      instance_destroy(); // Shaker zerstört sich selbst
      }

      4. wo immer nun deine Explosion stattfindet, erstellst du dieses Objekt mit folgendem code, oder per Instance Create Button ( Glühbirne)

      instance_create(x,y,shaker ); // shaker wird aufgerufen

      der Effekt verstärkt sich wenn wir statt random_range (-2,2) einfach (-5,5) nehmen usw


      wir könnten mit audio_play_sound( SOUND, 10, false) einen 5 sekunden langen Erdbeeben SOund, oder einen Explosionsound vor dem shake einfügen



      Ich hoffe ein paar von euch besonders ANfänger können damit etwas anfangen - das ganze habe ich eben getestet es sollte funktionieren wenn es probleme gibt stehe ich zur verfügung


      ich hab einen ähnlichen code für meinen screenshake. unschön ist es allerding, wenn man die grafik interpoliert. dann erscheinen beim screenshake nämlich unschöne lines auf dem display...

      aber gut erklärt, fuex :)

      fuexline schrieb:

      die lines habe ich nicht liegt wohl an der tearing bzw synch option in den global game settings


      ok?
      ich habe mehrere scrollebenen in meinem shoot´em´up sidescroller. und wenn ich beim screenshake y mitbenutzte, habe ich an den schnittstellen der paralaxebenen lines für den moment des shakes. ohne interpolieren habe ich diese nicht...
      insofern nutze ich bei meinem screenshake nur x...
      wenns was gebracht hat dann bin ich schon happy


      btw kann natürlich sein das bei dir im step eventuell was mehrfach ausgefürt wird dann können solche probleme entstehen, erwische mich auch oft sound im step laufen zu lassen oder grafiken zu createn xd