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

06.07.2009, 16:04

grundlegende Frage, Klassendesign

Hi, mal ne generelle Frage zum Klassendesign bei einem Spiel.

Ich bastel ja gerade an einem 2D Spiel (wird wohl noch n Weilchen dauern^^)

Und jetzt steh ich wie die Kuh vorm Tor wenn es ums Design der Klassen für die Spielobjekte, oder besser deren Handhabung geht.

Man nehme an es gibt 100 versch. Gegner, 200 Items...whatever.

Jetzt hab ich zwar für jeden möglichen grafischen und nichtgrafischen Typen eine Basisklasse, und vererbe immer fein alles was die nächst höhere Abstraktionseben des Objekts können soll weiter, aber ich möchte ja gern das jeder Gegner zb. ein unterschiedliches Verhalten hat, der eine evtl. mehrere Waffen..usw. usw.

Jetzt kann ich natürlich für jeden Gegner, Item usw. eine konkrete Klasse mit ausimplementiertem Verhalten und Eigenschaften erstellen, das scheint mir aber etwas arg "unschön".

Dann dacht ich daran jedem Objekt einfach so eine Art Parameter gesteuerte KI-Klasse, Waffen-Klasse, Wegfindungs-Klasse usw. anzuhängen, in der jeder Gegner dann immer nachschaut was er jetzt als nächstes machen würde.

Scheint eine sehr flexible Lösung zu sein...aber lange Rede, kurzer Sinn, wie macht mans denn "richtig" ?

Das mit den Gegnern war nur ein Beispiel, das Problem findet sich an vielen Stellen meiner Planung wieder, das ich sehr ähnliche Objekte mit verschiedensten Eigenschaften belegen möchte.

Am liebsten hät ich ja nur einen Typen als Basisklasse für alles (ähnlich object in C#), der dann automatisch wenn ich update() und draw() aufrufe immer das richtige in seinen abgeleiteten Klassen macht ^^

Wie Wild treibt ihr es denn so mit der abstraktion von Spielobjekten ?

Eher viele verschiedene Klassen, oder eher sehr genersiche, wenige Klassen usw. ?

Tschja, in der Hoffnung irgend jemand versteht mein Geschreibsel, Freu mich auf Antworten.

Grüße Kozuore.

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

2

06.07.2009, 16:22

mir gefällt es so, wie es bei mangos implementiert ist: du hast eine basisklasse für alle objekte (spieler, gameobjects, kreaturen, etc.) Unit. von dieser ist dann Player (der spieler), GameObject (benutzbare objekte wie türen, knöpfe, etc.) und Creature (mobs, bosse, npc's, etc.).

sie alle werden in der datenbank gespeichert, für player, go und creature jeweils eine eigene template tabelle. dort werden informationen wie z.b. die model id (das aussehen), den schaden den sie machen (ist bei mangos komplizierter da dies mit einer formel berechnet wird... dort wird einfach min- und maxdmg gespeichert), ihr scriptname, ihre faction (freundlich, feindlich, neutral, etc.), etc. gespeichert.

falls sie nun keinen scriptnamen haben machen sie das standardverhalten aus Creature wo sie dich einfach angreifen falls sie feindlich sind (bzw. neutral und du greifst sie zuerst an^^).

wenn sie einen scriptname haben, dann wird das "script" (eigentlich auch c++ code, einfach in einer library) angesprochen (tipp: funktionspointer).

dadurch musst du im code nicht viel machen und kannst das aussehen (model) und grundlegende verhalten (freundlich/feindlich, schaden, etc.) per datenbank steuern.

du kannst sehr vieles über die datenbank machen (z.b. dialoge usw.) wo du dann nur noch der creature in der db ein flag geben kannst (tipp: bitmasks, damit kannst du platz sparen) und dann weiss die creature-implementierung automatisch, dass sie in der db aus der text-tabelle den dialog für diese creature auslesen muss.


dadurch musst du nicht für jedes objekt eine eigene implementierung machen und kannst alles per db steuern. spezialfälle kannst du ja dann immernoch in der go/creature klasse abfangen und dort drin ein spezielles verhalten definieren (z.b. wenn er objekt x hat noch prüfen ob er auch objekt y hat und in dem fall den schaden verdoppeln)


hoffe das hilft dir so als idee.

Gruss
DasBlub

3

06.07.2009, 16:33

Ja das klingt soweit in der Tat sehr gut.

So ähnlich dacht ich mir das mit den anzuhängenden Klassen für das Verhalten (ja freilich über pointer),

die Idee mit dem Standardverhalten klingt auch gut.

Welchem Objekt dann was zugeordnet wird, oder auch nicht, regelt bei mir ein Set aus Configdateien (lvl1.cfg usw.) naja is ja quasi auch ne Datenbank ^^

Dann werd ich mal weiter in diese Richtung planen.

Werbeanzeige