Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.03.2019, 14:55

2D SpaceShooter Waffenslots und Kategorien von Ausrüstungskomponenten

Hallo zusammen,
ich habe nach einer längeren Pause wieder angefangen, hobbimäßig Spiele zu entwickeln und bin mir nun aktuell nicht sicher, was das richtige Vorgehen ist. Daher hoffe ich, dass Ihr mir hier ein paar Tipps geben könnt.

Kurze Beschreibung:
Ich arbeite mit Gamemaker Studio 2 und entwickle gerade ein 2D Space Shooter. Die Raumschiffe sollen nun beliebig ausgerüstet werden können. Hierzu hat jedes Raumschiff diverse Slots, welche dann mit den entsprechenden Komponenten ausgerüstet werden sollen. Zukünftig will ich das Spiel zu einem Loot basiertem Spiel entwickeln, indem man von Gegnern neue Waffen finden kann etc.

Aktuelle Architektur:
In meiner aktuellen Architektur habe ich ein Spielerobjekt, welches das im zugeordnete Schiff kontrolliert. Das Schiff besitzt als Attribute mehrere Listen, welche neben den möglichen Slots auch die bereits vorhandenen Waffen auflisten. Alle Ausrüstungskomponenten basieren dabei auf der Basisklasse Komponenten und leiten sich dann je nach Typ von dieser ab (z.B. Antrieb, Primärwaffe, Sekundärwaffe, Schild...).
Um das ganze möglichst dynamisch zu gestalten habe ich die entsprechenden Definition (z.B. Schiffswerte, Schiffslotliste und Komponentenwerte) in verschiedenen CSV Dateien hinterlegt, welche zu Beginn des Spiels auslesen und beim Erstellen der verschiedenen Instanzen verwendet werden.
Die Schiffsklasse sieht hierbei wie folgt aus:
Hinweis: Es wurde in GML und nicht in C++ programmiert

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//information about possible ship Slots
lShipSlots = ds_list_create();

//assigned shipslots
lCompWeaponPrim = ds_list_create();
lCompWeaponSec = ds_list_create();
lCompWeaponDef = ds_list_create();
lCompEngine = ds_list_create();
lCompGenerator = ds_list_create();
lCompShield = ds_list_create();


Ich habe hierzu nun die folgenden Fragen
  1. Aktuell speichere ich ja die möglichen Slots und die tatsächlichen Ausrüstungsgegenstände in verschiedenen Listen. Wäre es besser, wenn ich die Slots fest mit den Ausrüstungsgegenständen verknüpfe? Meine Idee hierzu wäre, dass ich den Slot ebenfalls in Komponentenliste speichere, den Listeneintrag jedoch um die ID der zugeordneten Waffe etc. ergänze.
    Beispiel: lCompWeaponPrim [0] = [posX, posY, typ, instanzId]
  2. Weiterhin gibt es, wie bereits erwähnt, verschiedene Typen an Ausrüstung. Aktuell unterscheide ich diese durch einen festen String, was in meinen Augen aber nicht die beste Lösung ist, da ich nun stets den String festkodiert abfragen muss, falls ich diesen benötigen. Meine alternative Idee wären Konstanten oder (wahrscheinlich noch besser) ein Enum. Hier stellt sich für mich jedoch die Frage, wie ich das Enum in der CSV Datei abbilden kann, da diese ja auch den Typen speichern muss.
  3. Ergänzung zu 2tens: Neben dem Typ habe ich auch eine Schadenstyp und eine Slot/Ausrüstungsgröße (s,m,l). Würde ich diese genau wie Punkt 2 umsetzen oder gibt es hier andere Besonderheiten, die ich beachten muss?

Schonmal vielen Dank im Voraus :)

Jonathan

Community-Fossil

  • Private Nachricht senden

2

21.03.2019, 09:47

Ich habe nie was mit GML gemacht, mir erscheinen die Fragen aber hinreichen allgemein, also schaun wir mal:

Ich denke, bei allen Fragen geht es nicht primär um Geschwindigkeit oder Effizienz, die Verarbeitung der Daten sollte irgendwo im Spielstart passieren und allgemein vernachlässigbar sein. Also geht es wohl eher darum, das ganze bequem und robust zu benutzen zu machen. Sprich: Wenn irgendwo Quatsch gemacht wird (Waffen auf Slots zugewiesen werden, die nicht existieren oder so) willst du das erkennen und entsprechend behandeln können.

zu 1.: Ich bin mir nicht ganz sicher, was damit gemeint ist. Prinzipiell klingen aber beide Lösungen machbar.

zu 2.: Du kannst natürlich beim laden hardkodiert den String abfragen und eine entsprechende Konstante / Enum-Wert zuweisen (z.B. lange Liste als else-ifs). Das ist ansich gar nicht so schlecht, weil du in den Dateien verständliche Werte speicherst ("Left-Weapon" statt SlotID=14) und beim Laden zentral Fehler abfragen kannst.

zu 3.: Ich denke, das sollte genauso gehen, aber du hast noch nicht wirklich beschrieben, was der Unterschied ist.


Insgesamt: Alle Probleme hören sich an, als gäbe es keine wirklich falsche Lösung, alle Varianten werden mehr oder weniger gut funktionieren. Probier es einfach aus und bau notfalls später alles nochmal um. Man lernt ja sowieso besser durch praktische Erfahrung als durch theoretische Diskussionen, aber es sollte wie gesagt sowieso nicht so viel schiefgehen.
Lieber dumm fragen, als dumm bleiben!

3

21.03.2019, 13:10

Hallo Jonathan,
vielen Dank für deine Antworten.

zu 1.: Ich bin mir nicht ganz sicher, was damit gemeint ist. Prinzipiell klingen aber beide Lösungen machbar.

zu 2.: Du kannst natürlich beim laden hardkodiert den String abfragen und eine entsprechende Konstante / Enum-Wert zuweisen (z.B. lange Liste als else-ifs). Das ist ansich gar nicht so schlecht, weil du in den Dateien verständliche Werte speicherst ("Left-Weapon" statt SlotID=14) und beim Laden zentral Fehler abfragen kannst.

zu 3.: Ich denke, das sollte genauso gehen, aber du hast noch nicht wirklich beschrieben, was der Unterschied ist.

zu 1: Ich habe die Logik so umgestellt, dass nun keine zusätzliche Liste mit leeren Slots mehr existiert, sondern sowohl Slots als auch Waffen (also deren Instanz Ids) in der gleichen Liste stehen. Aktuell bin ich am überlegen, ob ich dies nicht sogar noch weiter generalisiere und eine Map/KeyValue Liste verwende. Dann könnte ich bei neuen Komponenten einfach einen weiteren Schlüsseleintrag z.B. über Enum, verwenden und müsste keine neue Liste im Quellcode ergänzen.

zu 2: Daran habe ich noch gar nicht gedacht, finde ich eine super Idee und wird heute Abend so umgesetzt :) Den Enum fest verdrahten wird sowieso niemals funktionieren, da sich bei Änderung des Enums ja nicht die gespeicherten Ids in der CSV ändern. Auch verhindere ich so, dass durch eine Anpassung des Enums plötzlich Antriebe zu Waffen werden und das ganze Spiel abstürzt.

zu 3: Ich persönlich sehe da auch erstmal keinen Unterschied. Da ich mir aber nicht sicher bin ob es da eventuell irgendeinen Unterschied gibt, den ich nur nicht sehe, wollte ich sicherheitshalber nachfragen ;)

Werbeanzeige