[TUT] Zeit, Tag und Nacht Wechsel (24h Format) + Dynamische Lichtquellen

    • GM 8

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [TUT] Zeit, Tag und Nacht Wechsel (24h Format) + Dynamische Lichtquellen

      Ich möchte euch heute ein kleines Tutorial vorstellen, in dem ihr die Grundlagen für ein Zeit-System vermittelt bekommt. Im Prinzip ist es ganz einfach:
      Ihr setzt eine Variable, die von 0 bis 59 hochzählt, danach wechselt sie zu 0 und eine Minute wird hinzugefügt. Das kann man dann bis auf Tage, Wochen, Monate, Jahre ausbauen. Auch ein (halb) Flüssiger Übergang ist in diesem Tutorial enthalten: ab 20 Uhr wird der Alphawert für ein Rectangle, das über den Bildschirm gedrawt wird erhöht, bis er 0.7 (oder einen anderen Wert) erreicht hat. ab 4 Uhr wird dieser wieder abgezogen. von 20 - 6 Uhr ist Nacht.

      soweit zur Theorie, nun zur Praxis

      Als aller erstes müssen wir ein Objekt erstellen. nennen wir es einfach "Controller" denn es kontrolliert die Werte. Als Depth stellt ihr am besten -2 ein, da dieser Controller über allen anderen Objekten gedrawt werden soll.

      Definiert die folgenden Variablen im :event_create: -Event
      Spoiler anzeigen

      GML-Quellcode

      1. seconds = 0; //Anzahl der Sekunden
      2. minutes = 0; //Anzahl der Minuten
      3. hours = 17; //Anzahl der Stunden
      4. days = 0; //Anzahl der Tage
      5. global.night = 1; //derzeit ist keine Nacht
      6. global.nightalpha = 0; //der Alphawert beträgt 0
      7. addme = 1; //einfache Platzhaltervariable


      soweit so gut, nun habt ihr alle wichtigen Variablen definiert. Nun kommt das Herzstück unserer Zeit-Engine: die Zähler (oder so). Also weiter im Step Event:
      :event_step:
      Spoiler anzeigen

      GML-Quellcode

      1. //Wie viele Sekunden werden pro step hinzugefügt?
      2. seconds += 10;
      3. if (seconds >= 59.99){ // sobald die Sekunden mehr oder exakt 59,99 sind, wird eine Minute hinzugefügt. Sekunden werden wieder auf 0 gesetzt
      4. minutes += 10;
      5. seconds = 0;
      6. }
      7. if minutes >= 59.99{ // sobald die Minuten mehr oder exakt 59,99 sind, wird eine Stunde hinzugefügt. Minuten werden wieder auf 0 gesetzt
      8. hours += 1;
      9. minutes = 0;
      10. }
      11. if hours >= 23.99{ // sobald die Stunden mehr oder exakt 23,99 sind, wird ein Tag hinzugefügt. Stunden werden wieder auf 0 gesetzt
      12. days += 1;
      13. hours = 0;
      14. }
      15. // von 20 bis 6 Uhr ist Nacht
      16. if (hours == 20){
      17. global.night = 1;
      18. }
      19. if (hours == 6){
      20. global.night = 0;
      21. }
      22. if (hours >= 20 && addme=1) {
      23. global.nightalpha+=0.01;
      24. }
      25. if (global.nightalpha >= 0.7){
      26. addme = 0;
      27. }
      28. if (hours >= 4 && hours <= 6 && addme == 0){
      29. global.nightalpha-=0.01;
      30. }
      31. if (global.nightalpha <= 0){
      32. addme = 1;
      33. }
      Alles anzeigen


      Das wars eigentlich auch schon mit dem Technischen. Jetzt kommt nurnoch ein wenig gedrawe:
      :event_draw:
      Spoiler anzeigen

      GML-Quellcode

      1. draw_set_color(c_white)
      2. draw_set_alpha(1)
      3. draw_text(0,0,'seconds: ' +string(seconds))
      4. draw_text(0,16,'minutes: ' +string(minutes))
      5. draw_text(0,32,'hours: ' +string(hours))
      6. draw_text(0,48,'days: ' +string(days))
      7. draw_text(0,62,'nightalpha= ' +string(global.nightalpha))
      8. draw_text(320,240,'Zeit: ' +string(hours) +string(':') +string(minutes) +string(':') +string(seconds))
      9. draw_text(320,256,'Nacht: ' +string(global.night))


      fertig? nein noch nicht! jetzt kommt ein weiterer wichtiger Teil, sicherlich wollt ihr ja Auch ein bisschen Dunkelheit haben ;)
      wir erstellen ein neues Objekt, name ist irrelevant, also lasst eurer Fantasie freien lauf :) die Depth auf -1
      :event_draw: Event vom neu erstellten Objekt
      Spoiler anzeigen

      GML-Quellcode

      1. draw_set_color(c_black) // wir färben das Rechteck Schwarz
      2. draw_set_alpha(global.nightalpha) // der Alphawert entspricht global.alpha (vorher im Step Event von "Controller" definiert
      3. draw_rectangle(0,0,640,480,0) //und drawen das Rechteck schließlich über den gaaaaaanzen Raum


      das Exampel:
      zeit.rar



      Nachtrag vom 28.11.2014:

      Aufgrund einer Anfrage bezüglich dynamischer Lichtquellen
      Spoiler anzeigen

      LifeGpDA schrieb:

      Hi Domis4, und die anderen Game Maker freunde!

      Dieses Day Night system habe ich in meinem Spiel eingebaut, funktioniert auch super, bis auf ein problem, die lichtquellen und die taschenlampe wird auch verdunkelt! Und es klappst irgendwie nicht dieses zu umgehen!

      Das liegt vor allem daran das der schwarze Rechteck über die ganze spielwelt gezeichnet wird und die lichtquellen liegen auch darunter und werden mit verdunkelt. Hier der code für die taschenlampe:

      Creat:

      Quellcode

      1. image_xscale = 1.5;
      2. image_yscale = 1.5;
      3. image_alpha = 0.85;


      Step:

      Quellcode

      1. if instance_exists(obj_Player)
      2. {
      3. x = obj_Player.x;
      4. y = obj_Player.y;
      5. image_angle = obj_Player.b_angle;
      6. }
      7. else instance_destroy();


      Die taschenlampe hat sehr gut funktioniert als ich den draw_clear_alpha(c_black, 0.89); code angewendet habe damit es dunkel wird.

      Ich brauche eine lösung für das problem. Entweder in Tag und Nacht modus, anstatt global.nightalpha=0 den draw_clear_alpha(c_black, 0.89); anzuwenden. Oder die taschenlampe anders zu machen.

      Kann man irgendwie den

      Quellcode

      1. draw_set_color(c_black)
      2. draw_set_alpha(global.nightalpha)
      3. draw_rectangle(0,0,640,480,0)

      Komplett rausnehmen und den draw_clear_alpha code für die verdunckelung verwenden?

      Bitte um Rat!

      habe ich ein weiteres, kleines Exampel angefertigt, dass Surfaces für dynamische Lichtquellen nutzt.
      Spoiler anzeigen

      domis4 schrieb:

      Hallo,

      damit wirst du nicht sonderlich weit kommen. Am einfachsten geht das mit Surfaces.
      Hab' mich zwar lang nicht mehr damit beschäftigt, ein kleines Example ist allerdings doch entstanden:
      zeit surface.zip

      Für weitere Fragen bezüglich Surfaces, empfehle ich dir hier einen neuen Thread zu erstellen.






      i think, therefore 私 は.

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von domis4 ()

    • Für mich war die Idee mit dem bis 59 zählen lassen, einfach schon super, nur als ich nach sowas gesucht habe, war ich mal wieder zu dumm die Sachen zu finden die mir weiterhelfen. Zum Glück hat mein Vorposter mich auf das Tut aufmerksam gemacht ;)
      GML lernen geht leicht :)
      1. http://www.gm-d.de/help/ (deutsch)
      2. gm-d.de/wbb/index.php/Thread/2270/ (Einsteiger-Referenz)
      3. docs.yoyogames.com/ (Hilfe auf Englisch von GM:S)
    • Hi domis4,

      ohne gml zu kennen oder Dein Example ausprobiert zu haben, kann ich zumindest sagen, dass ich Die Idee verstanden habe. Und darum gings doch :). Ich fands gut zu lesen und schlüssig erklärt! Freue mich auf Deine nächstes Tutorial.

      Eine Anregung hab ich auch noch:
      Wie wäre es umsetzbar, dass je nach ausgeführter Handlung eine festgelegte Zeitspanne verstreicht? Bsp: Charakter geht schlafen, um die Gesundheit aufzufüllen. Bildschirm wird kurz schwarz (oder Meldung erscheint), dann sind 7 Stunden verstrichen.

      Viele Grüße,
      Ed
      Schönen Gruß,
      SirEdward

      myspace.com/yourgameost (Bei Nutzung bitte kurze Info)
    • Danke für dein Feedback. Das Tutorial ist mittlerweile ein wenig eingestaubt und die Code Formatierung gefällt mir auch nicht mehr. Umso mehr freue ich mich, dass dir die Erklärung gefallen hat. Die wichtigste Aufgabe eines Tutorials ist, meiner Meinung, die Idee dahinter zu vermitteln.

      Zu deiner Frage, um die Stunden verstreichen zu lassen gibt es mehrere Möglichkeiten. Der einfachste Weg ist, mittels hochzählen einer Variable und einem gezeichnetem Rechteck einen "Fade-to-Black"-Effekt zu erstellen. Dann beim erreichen des Wertes einfach mittels:

      GML-Quellcode

      1. controller.seconds += 7; //Inkrement um 7


      Objekt.Variable += Wert;


      Worauf du noch achten solltest ist, dass beim Sprung über 24 bzw 0 Uhr, die Variable hours auf 0 gesetzt wird.
      Das heißt bei:
      • 23h + 7h = 0h
      • 22h + 7h = 0h
      • 21h + 7h = 0h
      • usw ...


      das liegt an der folgenden Abfrage:

      GML-Quellcode

      1. if (hours >= 23.99){
      2. days+=1
      3. hours=0
      4. }


      Eine Variable, die den Overhead mitberechnet würde das Problem lösen:

      GML-Quellcode

      1. if (hours >=23.99){
      2. overhead_hours = 24 - hours;
      3. days+=1
      4. hours=0 + overhead_hours;
      5. }


      bei folgendem Fall, wird die Zeit korrekt umspringen:

      22 Stunden + 7 Stunden = 29 Stunden;
      29 Stunden - 24 Stunden = 5 übrige Stunden;
      addiere Tag
      0 Stunden + 5 übrige Stunden = 5 Stunden.

      good luck!
      i think, therefore 私 は.
    • Hi Domis4, und die anderen Game Maker freunde!

      Dieses Day Night system habe ich in meinem Spiel eingebaut, funktioniert auch super, bis auf ein problem, die lichtquellen und die taschenlampe wird auch verdunkelt! Und es klappst irgendwie nicht dieses zu umgehen!

      Das liegt vor allem daran das der schwarze Rechteck über die ganze spielwelt gezeichnet wird und die lichtquellen liegen auch darunter und werden mit verdunkelt. Hier der code für die taschenlampe:

      Creat:

      Quellcode

      1. image_xscale = 1.5;
      2. image_yscale = 1.5;
      3. image_alpha = 0.85;


      Step:

      Quellcode

      1. if instance_exists(obj_Player)
      2. {
      3. x = obj_Player.x;
      4. y = obj_Player.y;
      5. image_angle = obj_Player.b_angle;
      6. }
      7. else instance_destroy();


      Die taschenlampe hat sehr gut funktioniert als ich den draw_clear_alpha(c_black, 0.89); code angewendet habe damit es dunkel wird.

      Ich brauche eine lösung für das problem. Entweder in Tag und Nacht modus, anstatt global.nightalpha=0 den draw_clear_alpha(c_black, 0.89); anzuwenden. Oder die taschenlampe anders zu machen.

      Kann man irgendwie den

      Quellcode

      1. draw_set_color(c_black)
      2. draw_set_alpha(global.nightalpha)
      3. draw_rectangle(0,0,640,480,0)

      Komplett rausnehmen und den draw_clear_alpha code für die verdunckelung verwenden?

      Bitte um Rat!