Hallöchen,
Jetzt sind mal wieder die Denker unter euch gefragt, es geht um einen Denkansatz für ein Problem.
Ich schreibe gerade ein 2D Spiel in C++ und OpenGL. Dazu habe ich einen Karteneditor geschrieben und die Karten und die Spiel-Engine zum Laden der Level und zum Rumlaufen samt Kollision funktioniert soweit schon.
Jetzt sollen erste anklickbare Gegenstände hinzukommen, z.B. Schalter, die ein bestimmtes Ereignis auslösen.
Dabei tritt die Frage auf, wie realisiert man sowas am besten? Im Moment mache ich es so, dass ich im Karteneditor den Schalter platziere und ihm eine einmalige ID vergebe. Diese kann ich in der Hauptschleife der Spiel-Engine abfragen und damit herausfinden, welches Ereignis (also eine gescriptete Funktion) sich bei Druck auf "Enter" im Sichtbereich des Spielers befinden und ausgelöst werden sollen. Soweit ist alles klar. Die Problematik ist jetzt, wie lasse ich diese Funktionen auslösen und wie verfahre ich bei Script-Ereignissen die einige Variablen benötigen und eventuell eine andere Grafik für das Objekt laden. (z.B. Schalter ein und aus-Grafik)
Ich hab's testweise jetzt so gemacht, dass ich ein Bool-Array mit je einem Element pro Ereignis erstellt habe. Der Wert wird beim Auslösen auf True gesetzt. Dann wird in der Hauptschleife des Spiels einfach dieser Wert jedes Array-Elements abgefragt und der Scriptinhalt des Events ausgeführt, sobald dort ein True auftritt. Bei einfachen Events, die nur schnell ein paar Variablen ändern ist das kein Problem, doch wenn sich die Grafik des Objekts ändern soll, dann kommt das Problem auf, dass bei erneutem Laden des Levels (nach verlassen und wieder betreten) die ursprüngliche Objekt-Grafik geladen wird. Es wird eben wieder alles auf Normalzustand zurückgesetzt und die Scriptänderungen verfallen, denn die Objekte werden ja aus der Karte wieder in den Ur-Zustand geladen. Und ein Kartenwechsel ist bei dieser Art spiel leider sehr häufig gegeben.
Da kommt die Frage auf, ob diese Events nach dem Aktivieren immer im Speicher verbleiben müssen und ständig "aktiv", um beim Level-Laden dafür sorgen zu können, dass sie immer noch ausgeführt sind. Oder eben, wie man es sonst geschickt lösen könnte. Schließlich verbrauchen diese Events dann auch Rechenleistung und wenn sie ewig im Speicher verbleiben wird dieser auch irgendwann damit überfüllt sein. Und wenn gegen Ende des Spiels ewig noch 1000 Schleifen mit Scriptinhalt von Schaltern aus vergangenen Karten ausgeführt werden, geht das sicher extrem in die darzustellenden Frames pro Sekunde.
Manche Scripte sollen auch einen Timer vorhersehen, dass erst nach X Sekunden etwas passiert. Daher brauchen sie gültige Variablen über längere Zeit hinweg, die danach aber aus dem Speicher gelöscht werden können, nachdem das Event beendet ist. Das bedeutet, die Funktion muss sich selbst über mehrere Durchläufe halten können, einige Variablen errechnen, und sich danach selbst abstellen und den Speicher freigeben. Als kleinen erschwerenden Zusatz darf der Schalter, der den Timer gesetzt hat, dann auch noch nur einmalig ausgeführt werden. Damit muss sich das Event nach Beenden und Speicherfreigeben also doch irgendwie merken, dass es bereits ausgeführt worden ist und nicht nochmal starten darf.
Also wie könnte man diese ganze Script-Event-Sache realisieren? Vielleicht bin ich mit dieser Script-Bool-Array-Sache ja total auf dem Holzweg und es gibt viel effizientere Wege, so etwas zu machen?
Ich bin für jeden Pseudocode oder für Denkansätze dankbar. Es muss keine direkte Lösung sein, einfach etwas, was mich irgendwie weiterhelfen könnte.
Grüße,
Ynnus