Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OOP und RPG (https://www.delphipraxis.net/56314-oop-und-rpg.html)

Master_RC 3. Nov 2005 19:54


OOP und RPG
 
hi leutz!

So...
Jetzt hab ich mal wieder vor ein kleines RPG zu erstellen :D
Nur diesmal eben mit OOP.

Nur... wie fange ich das an?
Wie zum Beispiel sollte das bei einem Charakter oder einem Gegenstand aussehen, etc.?

Habt ihr damit schonmal Erfahrung gemacht oder eine Vorahnung?

3_of_8 3. Nov 2005 20:08

Re: OOP und RPG
 
Delphi-Quellcode:
type
 TCharacter=class;
 public
  Health, Mana, Strength, Skill, Defense, Intelligence, Fame: Byte;
  IsEnemy, Alive, Visible, Vulnerable: Boolean;
  X, Y, MapID, Angle: Word;
  TileSetID: Word;
  constructor Create;
  procedure Hurt(Value: Byte);
  procedure Kill;
  procedure Revive;
 end;
Das wäre ein guter Anfang.

Master_RC 3. Nov 2005 20:12

Re: OOP und RPG
 
danke :-D

so, nun häufen sich die Fragen:
1. Byte == "Int" bis 256, oder? ja... gut ^^
2. Wie stelle ich es an, wenn mein Charakter dann beispielsweise eine Statusveränderung hat?
3. gut, das Modell von dir lässt sich natürlich auch einfach auf nen Gegenstand übertragen
4. Wie speichere ich die dann ab? :gruebel:

Gut, zur Zeit fällt mir grade nicht mehr ein...

[ot]Warum steht eigentlich in deiner Sig, dass Borg keine Schweden sind?![/ot]

3_of_8 3. Nov 2005 20:32

Re: OOP und RPG
 
[ot]StarTrek 8 First Contact: "Borg? Klingt schwedisch!" (etwas später) "Eindeutig keine Schweden!"[/ot]

1. Klar. Kannst du auch durch irgendnen anderen Integer Typ ersetzen.
2. type TStatus=stNormal, stPoisoned, stFrozen, stBurning...; oder:
Poisoned, Frozen, Burning...: Boolean;
3. Klar.
4. Da gibt es einige Möglichkeiten: INI (nicht zu empfehlen), XML, Record, SQL Datenbank (seeehr ungeeignet). Gibt bestimmt noch andere Möglichkeiten.

Der_Unwissende 3. Nov 2005 20:35

Re: OOP und RPG
 
Hey,
OOP ist eigentlich mehr als gut geeignet für RPGs, schließlich ist die Idee dahinter, das reale Leben (was auch immer das sein soll) abzubilden.
Prinzipiell ist jedes einzelne Objekt (Avatar, NPC, Item, Gebäude, ...) ein eigenes Objekt. Du solltest diese in gemeinsame Gruppen (z.B. Avatar und NPC) stecken. Wenn etwas gemeinsame Eigenschaften hat, gehört es in eine Gruppe (und die gemeinsamen Eigenschaften in eine Basisklasse von der alle Mitglieder erben).
So kannst du auch später leicht neue Dinge deinem RPG hinzufügen.
Was Byte vs. Integer (Cardinal) angeht, solltest du gut überlegen ob es sich lohn die Wertvollen 3 Byte einzusparen. Immerhin wird deine CPU intern eh mit 32Bit arbeiten und somit sind Integers (und Cardinals) immer das Perfomateste.
Ein wichtiges Prinzip ist es, dass du dir von Anfang an auch eine Möglichkeit überlegst, wie du auf Ereignisse reagieren möchtest. Wenn sich z.B. die Stärke eines Spielers ändert, solltest du nicht direkt nur den Wert Strength (o.ä.) ändern, sondern dies über Propertys tun. Diese haben den Vorteil, dass sie mit einer Methode verknüpft werden können. Und in eben dieser kannst du auf Veränderung reagieren.
An sich solltest du auch eine Art Event-Listener-Modell einplanen. Am einfachsten (schönsten) geht dass, indem du zu allen Ereignissen ein Interface oder eine abstrakte Klasse (also immer eine für Zusammengehörige) vorsiehst. In diesen werden dann zu jedem Ereignis Methoden definiert, die als Argument das eingetretene Ereignis bekommen. Nun kannst du in zentraleren Klassen, die das Ereignis auslösen Listener registrieren, die immer benachrichtigt werden, wenn ein Ereignis auftritt. Dazu müssen die Objekte, die eine Nachricht erhalten wollen, das entsprechende Interface implementieren (oder von der abst. Klasse erben) und sich bei der zentralen Klasse als Listener registrieren.
Tritt nun ein Ereignis ein, kann die Klasse einfach jedem der Listener über die entsprechende Methode mitteilen, dass ein Ereignis eingetreten ist (und die Parameter übergeben).

Wie du etwas speicherst, kommt ganz drauf an, was du alles speichern möchtest und was nicht. Du solltest alles was Variablen eines Objekts sind in einen großen Stream schreiben (der wahrscheinlich gar nicht so groß wird). Dann gibt es auch noch gute Komponenten, die es dir erlauben Files zu packen. Gibt auch da viele Möglichkeiten.

Ich glaube das ist schon mal (ein stark vereinfachter) erster Einblick, was du alles mit OOP machen kannst. Aber (auch wenn es hier noch sehr abstrakt ist) ein RGP ist halt doch ein sehr umfangreiches Projekt! Also nicht zu groß planen, Qualität sollte immer Vorzug haben und dann ist etwas kleines auch leichter zu erweitern und macht auch viel mehr Spaß!
Den wünsch ich dir auch,

Gruß Der Unwissende

3_of_8 3. Nov 2005 20:43

Re: OOP und RPG
 
Ich hab mal ein paar Ideen dazu gesammelt, hab das Projekt aber dann gestoppt (nach ein paar Überlegungen), da mir Kenntnisse und Grafiken fehlen.

So Kleinigkeiten hab ich mir schon überlegt, z.B. wie man aus einer Zielkoordinate und der momentanen Position des Spielers einen Winkel herauskriegt.

Noch ne Frage: 3D oder 2D?

Master_RC 3. Nov 2005 20:55

Re: OOP und RPG
 
(Für "Non-RPGler": Avatar == Charakter ;) )

2D per DelphiX
(nein, kein openGL, ich versuchs erstmal mit DelphiX!)

Also natürlich 2D mit rumlaufen ;)

@Unwissender:
Im Grunde kenn ich das Prinzip ja schon :) Immerhin mach ich den lieben langen Tag nur RPGs ^^
(Wer mein Browsergame-RPG sehen will, soll mir ne PN schicken :P )

Weitere Fragen:
Zitat:

type TStatus=stNormal, stPoisoned, stFrozen, stBurning
Wie genau leg ich dann diese Stati fest? Bzw. bei "Poisoned" sollte es ja X Giftschaden geben, wie kann ich den dan festlegen?

Zu 4.:
Für mich kommen derzeit 2 (3) Sachen in Frage:
XML => nur wie funktioniert das dann mit diesem OOP?
Record => Hö? Records sind doch aber nicht OOP!
Stream => weiß ich auch nicht wies funzt ^^'

Dann gibt es ja noch "Vererbung".
Also ich habs mir so gedacht:
Ich erstelle einen Grundcharakter (oder eben gegenstand).
Dann gibt es meinetwegen Charaktere, eben von diesem Grundcharakter, die aber die Eigenschaft "Ützlebrütz" haben.
So... wie mache ich da, bzw. wie finde ich heraus, ob der /es die Eigenschaft bereits hat, etc.?

[ot]Achja, stimmt ;D[/ot]

3_of_8 3. Nov 2005 21:03

Re: OOP und RPG
 
Also bei Records ist es ganz einfach: Du erstellst parallel zur Klasse noch einen Record mit den gleichen Variablen wie die Klasse nur ohne Methoden und speicherst den dann in ein File.

Bei Vergiftung usw. musst du das halt dann anders machen:

Poisoned, Frozen, Burning: Boolean;
PoisonDamage, PoisonTime, FrozenTime, BurnTime: Cardinal; //(in ms)

Du kannst natürlich einen Grundcharakter erstellen und dann noch THaendler usw. Aber nicht sowas in der Art, dass jeder Charakter in deiner Welt eine eigene Klasse hat, das gibt ein Chaos. Kannst ihm ja noch userdefined Variablen geben.

Eine Idee für Quests habe ich auch:

Delphi-Quellcode:
type
 TQuest = class
 public
  Status=(qsUnknown,qsAccepted,qsDenied,qsSolved,qsFailed);
  UserDefined1, UserDefined2, UserDefined3, UserDefined4...UserDefined10: Integer; //Questabhängig
 end;
Bei TCharacter kannst du noch die Variable AttackTarget: ^TCharacter; hinzufügen.

malo 3. Nov 2005 21:03

Re: OOP und RPG
 
Zitat:

Zitat von Master_RC
Dann gibt es ja noch "Vererbung".
Also ich habs mir so gedacht:
Ich erstelle einen Grundcharakter (oder eben gegenstand).
Dann gibt es meinetwegen Charaktere, eben von diesem Grundcharakter, die aber die Eigenschaft "Ützlebrütz" haben.
So... wie mache ich da, bzw. wie finde ich heraus, ob der /es die Eigenschaft bereits hat, etc.?

Nachlesen? :gruebel:

Du solltest doch wissen, ob du eine Eigenschaft bereits gesetzt hast, oder nicht. Ansonsten: Compiler-Fehler abwarten ;)

Speedmaster 3. Nov 2005 21:26

Re: OOP und RPG
 
Allerdings musst du bedenken das du wenn du jeden Charakter als Klasse abbildest du bei jedem Patch den Code ändern musst. Daher empfiehlt es sich .NET zu verwenden, da du dort jeden Charakter in eine Assembly packen kannst, und diese Dynamisch laden!


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 Uhr.
Seite 1 von 5  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz