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

DudeAwesome

Frischling

  • »DudeAwesome« ist der Autor dieses Themas

Beiträge: 5

Beruf: Informatik Student/Typo3Entwickler

  • Private Nachricht senden

1

13.11.2013, 08:00

Designpattern für Strategiespiele

Hallo liebes Forum,

ich würde gerne eine kleine Diskussion starten und wissen welche Designpattern sich am besten für ein Strategiespiel eignen. Das Spiel sollte leicht erweiterbar sein (Gebäude, Einheiten, etc) eventuell auch eine Schnittstelle geben um selbst Mods zu erstellen. Wichtig für mich ist auch das der Code übersichtlich und strukturiert ist. Ich nehme an das es kein Patentrezept dafür gibt, da jedes Spiel anders ist aber nehmen wir mal als Orientierung das Spiel C&C das ja jeder kennen sollte.

Wäre es richtig/ratsam für die Einheiten/Gebäude usw. die Abstract Factory sowie für eine Mod API den Adapter zu benutzen oder liege ich mit meiner Vermutung komplett daneben? Fraglich ist natürlich wie man einen Mod dann erstellt da dieser vermutlich einfacher zu erstellen ist wenn man keine zu kompilierende Sprache verwendet sondern eher eine Interpretersprache.

Könntet ihr mir da ein paar Infos/Denkanstöße geben?


greetz

Dude

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

13.11.2013, 12:52

Ich kann mich LetsGo nur anschließen: Man sollte ein bestimmtes Design Pattern nur dann verwenden, wenn es der gegebene Fall erfordert bzw. wenn die gegebene Problemstellung sich damit einfacher realisieren lässt.
Allerdings könnte es auch sein, dass Dude keinen besonders guten Überblick über die vorhandenen DesignPattern hat. Sollte das der Fall sein, wäre es gut, sich diverse Pattern mal allgemein, unabhängig vom Strategiespiel, anzusehen, um beim Umsetzen dann zu wissen, ob sich ein Design Pattern anbietet, welches man sich mal angeguckt hatte.

Da man für eine Problemstellung ein passendes Design Pattern finden kann, sollte man sich erstmal über die Probleme Gedanken machen (was wohl besser gehen dürfte, wenn man mit der Umsetzung angefangen hat).
Ein Beispiel wären dabei die Einheiten. Diese könnte man entweder (Codeseitig) in einer Vererbungshierarchie unterbringen oder ihnen über ein Komponentensystem ihre Eigenschaften zuweisen. Was in deinem konkreten Fall besser ist, kann ich nicht grundsätzlich sagen, da solltest du einfach mal mit beiden Möglichkeiten rumprobieren.
Eine andere mögliche Problemstellung könnte es sein, dass es verschiedene Schadensarten gibt, gegen die es unterschiedliche Arten von Verteidigungen gibt und die Kombinationen (ein Angriff einer bestimmten Art gegen eine Verteidigung einer bestimmten Art) liefern eine unterschiedliche Effektivität. Wie sollte die Effektivität eines Angriffs ermittelt werden? Wo im Code (Angreifer oder Verteidiger?) sollte dies stattfinden?
Ein weiteres Problem dürften die unterschiedlichen Unterfrünge darstellen, auf denen sich vlt. nicht jede Einheit bewegen kann oder auf der eine Einheit langsamer wird. Das ist aber nur dann relevant, wenn es in deinem Spiel enthalten sein soll.

Und damit nicht bereits am Anfang ein zu großer Aufwand in eine Mod-API gesteckt wird, deren Nutzen (in dieser Form) sich nur schwer einschätzen lässt, solltest du dir darum erstmal keine Gedanken machen und ein Strategiespiel ohne Modifizierbarkeit entwickeln.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

13.11.2013, 13:58

Zum Thema Patterns wurde ja eigentlich schon alles wichtige gesagt. Patentrezepte gibts da nicht und ja, man könnte das so machen wie du vorschlägst, das hängt dann aber vom Rest deines Codes ab. Design Patterns machen eben nur Sinn wenn sie in dein restliches Design passen. Das kennen wir nicht also können wir nur raten. Ich könnte dir vermutlich für ziemlich viele Design Patterns Beispielanwendungsfälle in Strategiespielen geben. Das heißt aber nicht dass die am Ende auch alle sinnvoll sind. Lieber einfach erst mal entwickeln und dann gucken was sinn ergibt. Was die Erweiterbarkeit angeht, da macht es sinn wenn du die grundlegenden Komponenten deines Spiels in einer "normalen" Sprache deiner Wahl schreibst und die veränderbare Spiellogik etc in eine Skriptsprache auslagerst. Für mich hört es sich aber grad ein wenig so an als wenn dich das ganze noch etwas überfordern würde. Möge ich mich aber vielleicht auch irren. Eine einfache Möglichkeit für Mods kann man schon schaffen wenn man einfache Werte in Textdateien auslagert. Zum Beispiel Werte für Einheiten. Eine Datei könnte so aufgebaut sein:

Quellcode

1
2
3
4
5
6
7
Name der Einheit,
Hitpoints der Einheit,
minimaler Angriffsschafen,
maximaler Angriffsschaden,
Pfad zum Texturatlas für die Einheit,
Fähigkeiten der Einheit,
Lauftempo

Das sind nur einige Werte. Möglicherweise beitet es sich auch an XML, JSON oder irgendein anderes Format für die Dateien zu wählen. Nur je einfacher, desto einfacher kann es ein Laie erweitern. Eine Fähigkeit könnte hier auch wieder ein Pfad zu einer Datei sein welche die Fähigkeit beschreibt. Diese Datei speichert dann den Namen, die Textur und was halt so benötigt wird. Das was die Fähigkeit auslöst könnte dann entweder durch einfache Stichworte beschrieben werden, oder durch den Verweis auf ein auszuführendes Skript. Hier kann man halt wieder beliebig komplex werden. Für den Anfang würde ich es erst mal einfach halten damit du selbst den für dich besten Weg findest. Danach kannst du das ganze immer noch erweitern.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dreat

Frischling

Beiträge: 86

Wohnort: Heilbronn

  • Private Nachricht senden

4

13.11.2013, 19:19

Erweiterbarkeit war für mich in meinem aktuellen Projekt auch wichtig. Ich wollte für mein TD Spiel die Möglichkeit offen halten Waffen und Gegner ohne das Projekt zu kompilieren einzubauen. Da ich schon einmal mit XML Dateien probiert hatte wollte ich XML nutzen, mir wurde dann Linq ans Herz gelegt (C#). Umgesetzt hab ich das ganze bisher so:

Quellcode

1
2
3
4
5
6
<Weapons>

  <Weapon ID="0" Name="Bogen" Damage="50" Attacktime="2" Cost="20" Texture="bow2.png" ProjectileTexture="arrow.png" />
  <Weapon ID="1" Name="Kanone" Damage="50" Attacktime="2" Cost="20" Texture="canon.png" ProjectileTexture="canonball.png" />
  
</Weapons>


Die XML wird ausgelesen, Buttons werden in eine Liste geladen und eine Instanz für die jeweilige Waffe. Wenn man den Button für eine Waffe klickt wird die Waffe im Turm gespeichert

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
for (int j = 0; j < XMLButtons.Count; j++)
       {
                        //Wenn der Button für die Waffe geklickt wird
                        if (XMLButtons[j].Click())
                        {
                            //Wenn die Waffe dem Turm hinzugefügt wurde zieh dem Spieler das Geld ab
                            if(attackTowerList[i].AddWeapon(XMLWeapons[j].GetCopy()))
                                player.AddMoney(-XMLWeapons[j].Cost);
                            
                        
                        }
                    
                    }



Das selbe Prinzip hab ich für Gegner benutzt

Quellcode

1
2
3
4
5
6
<Enemys>
  <Enemy ID="0" Damage="10" Health="100" Speed="0,4" Attacktime="5" Reward="5"  Texture="enemy-normal1.png" />
  <Enemy ID="1" Damage="20" Health="100" Speed="0,8" Attacktime="5" Reward="10" Texture="enemy-normal2.png" />
  <Enemy ID="2" Damage="30" Health="100" Speed="1,0" Attacktime="5" Reward="15" Texture="enemy-normal3.png" />
  <Enemy ID="3" Damage="40" Health="100" Speed="1,5" Attacktime="5" Reward="20" Texture="enemy-normal4.png" />
</Enemys>

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

5

14.11.2013, 09:51

In meinem ersten Strategiespiel habe ich alles ohne jemals irgendwas von Designpatterns gehört zuhaben, programmiert. Es hat auch getan. Versuch nicht overengineering zu betreiben. Klar helfen Designpatterns und erzeugen richtig eingesetzt schöne Lösungen, aber letzten Endes willst du ein Spiel machen und solange keine anderen an den Code ran sollen, oder das Spiel erweitern sollen, helfen auch einfache Ansätze ohne Designpatterns.
Du hast zwar geschrieben, dass das Spiel einfach erweiterbar sein soll und der Code gut strukturiert und lesbar sein soll. Allein Designpatterns nehmen dir das aber nicht ab. Auf die Erweiterbarkeit würde ich im Zweifel erstmal verzichten, sondern schauen, dass du dein Spiel erstmal fertig bekommst.
Sorry wenn ich etwas pessimistisch klinge, aber ich habe in den Jahren schon so viele Projekte kommen und gehen sehen (meine eingeschlossen :( ), dass ich denke, dass zu oft das Spiel von der falschen Ecke angegangen wird.
Und in letzter Konsequenz kann man kleine Spiele(wozu ein RTS jetzt nicht gerade gehört) auch nach dem Konzept "Coding without Concept" entwickeln. Gute, kleine Beispiele dafür gibt es.

P.S.: Mein erstes Strategiespiel war zwar spielbar, wurde aber nie fertig. Das lag aber nicht daran, dass ich keine Designpatterns verwendet habe, sondern eher an dem HD-Crash, der mir den Code gekillt hat. Tja hätte ich damals schon mal über Backups nachgedacht. :(
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

Werbeanzeige