JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5d81bf658527cdcbe1411e17323eb5b8Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Ich hab mich eingekapselt
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 14:05    Titel: Ich hab mich eingekapselt Antworten mit Zitat

Tja, wunderbar OOP Programmier, alles schon gekapselt und von außen unsichtbar gemacht und dann kommt der Tag, an dem man doch mal an die inneren Werte muss.
Meine Situation: Ich programmiere gerade das ultimative RPG. Wie so viele andere auch.
Das ganze muss natürliche hyperflexibel sein, man soll jede kranke Idee in kürzest möglicher Zeit einbauen können. Daher habe ich mir folgendes ausgedacht:

Jede Aktion wird als eigene Klasse repräsentiert.
Eine Klasse laufen bekommt z.B: die Position eines Ortes und bewegt den Spieler dann dorthin, mit der aktuellen Laufgeschwindigkeit (diese ist in dem Laufenobjekt gespeichert).
Das ist wunderbar übersichtlich und sehr einfach zu erweitern. Man kann z.B: nicht nur ein Item aufheben, man könnte auch im Kampf gegen ein am Boden liegendes Item treten, damit es dem Gegner in den Kopf fliegt. Prinzipiell macht das keinen Unterschied.

Nun sollen aber diese Aktionen vollen Zugriff auf alle Charakterwerte haben. Und zwar direkten Zugriff, den sie sind ja quasi ein Teil der Charakterklasse. Man erweitert mit ihnen ja dynamisch die Charakterklasse, und ohne einen Charakter sind Aktionen sinnlos.

Eine erste Lösung war, eine Structur mit Charakterwerten einzuführen. Die hat jeder Charakter für sich privat und in dieser Struktur wird z.B. die Position gespeichert. Jetzt benötigt eine Aktion nur eine Referenz auf diese Strukturvariable und kann den Spieler schon komplett verändern. Andere Klassen können das nicht, da sie vom Charakter nicht diese Referenz bekommen.

Jetzt möchte ich allerdings ein Charakter von einem WorldObject ableiten, dadrin wären dann auch Dinge wie Items, Schalter, Projektile und so weiter. Das ermöglich an anderen Stellen wieder ein paar schöne Dinge.

Problem ist jetzt, Position und Größe würden in diesem WorldObject gespeichert. Daher wären diese nicht mehr in der CharakterWerteStruktur und daher kann ich nicht mehr so einfach auf die Privaten Teile des Charakters zugreifen.

Jetzt gibt es eine Menge Methoden, die mir alle nicht gefallen:

Get/Set Methoden: Ist mir zu unübersichtlich so viele zu schreiben, außerdem hätten dann ja alle Klassen fast vollen Zugriff und die paar die vollen Zugriff haben sollen, sollen direkten Zugriff haben

Alles Public: Eine einfache Lösung aber nicht wirklich schön. Wenig aufwand, direkter Zugriff, aber dann ist ein Charakter irgendwie so nackig.

Alle Aktionen sind friend: Soweit ich weiß kann man friend nicht vererben, hätte ich also 20 Aktionen müsste ich 20 Aktionen als friend deklarieren. Ne Menge schreibarbeit, dafür hat nicht jeder Zugriff und ich bekommen direkt Compilerfehler wenn ich ein friend vergessen habe.

Böses Casten: Eine zweite, identische Struktur bei der alle Elemente public sind. Ich könnte den Charakter casten und hätte so vollen Zugriff, dank cast wäre es schone in ziemlicher Eingriff, weswegen es etwas besser ist als alles public zu machen. Wenn ich allerdings etwas erweitere greif ich ganz schnell auf falschen Speicher zu, bekomme komische Werte und keine Compilerfehler. Ganz böse also, sowas will man nicht.

Viele Referenzen übergeben: Tja, wenn die Charakterwerte verteilt sind, kann man jeden Teil als Referenz übergeben. Ist allerdings umständlich und nicht so schnell zu erweitern.

Meine ursprüngliche Lösung mit der Struktur gefiel mir ganz gut, aber wenn dank Ableitung die Werte verstreut sind (was sich wohl nicht vermeiden lässt), dann funktioniert das nicht mehr.
Ich glaube ich tendiere Momentan zu der Methode mit dem Social Network (die Hälfte der Welt ist miteinander befreundet) da es relativ übersichtlich ist und ich nichts vergessen kann, da ich direkt Fehler bekommen würde.

Nur, gibt es jetzt vielleicht die eine ultimative Lösung dafür?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 17:40    Titel: Antworten mit Zitat

Wie wärs mit Abstrakten Basis Klassen und Vererbung? Ich glaube das sollte dein Prolbem beheben. Schön das du wieder am RPG weiterproggst Wink
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 18:03    Titel: Antworten mit Zitat

Ehrlich gesagt glaube ich nicht, dass das mein Problem behebt. Wenn ja versteh ich es nicht.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 18:23    Titel: Antworten mit Zitat

Wenn du an der grundlegenden Struktur des Systems nichts ändern willst, dann halte in der "Transfer-Struktur" eben einfach Zeiger/Referenzen auf die kritischen Objekte.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 18:40    Titel: Antworten mit Zitat

Wenn du das Spiel jemals fertigstellen willst, dann designe es vorher und überleg dir genau was für Features du brauchst. Weniger Bullshit, weniger unnötige Features. Wenn du weißt, was du brauchst, verschwendest du weniger Zeit mit architektonischen Krams, den du später eh wieder refactorst, weil dir eine bessere Möglichkeit eingefallen ist. :)

Zum eigentlichen Thema: Meine Lieblingsarchitektur ist eindeutig MVC http://de.wikipedia.org/wiki/Model_View_Controller. Ich modelliere meistens diese drei Packages unabhängig voneinander. Ins Model kommen alle wichtigen Daten, unter anderem auch die, die für das speichern und wiederherstellen von Spielständen unbedingt erforderlich sind... quasi die Datenbank des Spiels. Der Controller besteht aus vielen can? und do? Methoden. KANN ein Charakter eine Aktion ausführen (meistens eine logische Verknüpfung von Werten) und eine zugehörige Methode, die diese Aktion dann auch ausführt. Das hat meist das Werfen eines Ereignisses zufolge. View sollte klar sein... Graphische Darstellung deines Datenmodells.
Dazu ist noch zu sagen, dass Controller und View sehr eng zusammengehören. Je nach dem, was du mit der Datenbank gerade so anstellst, benutzt du ein anderes View/Controller-Pärchen (sprich: Level Editor, Game, KI Editor, Sandbox, ...).

Um die Kommunikation zwischen Model, View und Controller zu realisieren, benutze ich meistens das Mediator-Pattern, um Ereignisse im System aufzufangen und zu verteilen. Ist zentraler und übersichtlicher als das Observer-Pattern (jeder kann jedem Observerable "zuschauen").
Beim Mediator wird ein Event an den Event-Dispatcher geschickt... das enthält neben der Nachrichtenart auch einen "Kanal" und die eigentlichen Daten. Sub-Systeme können dann auf den Kanälen lauschen, die sie interessieren und auf Ereignisse entsprechend reagieren. Kanäle wären z.B. User Eingaben, KI-Ereignisse, ...

Mediator: http://de.wikipedia.org/wiki/Vermittler_%28Entwurfsmuster%29
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 21.03.2008, 20:08    Titel: Antworten mit Zitat

@Hazle
Klingt irgendwie sehr kompliziert. Könntest du mir evtl. n kleines Beispiel geben?
Also ich habe ja jetzt schon Aktionen in extra Klassen. Dann hab ich eine Modellklasse, für die Darstellung und halt meine Charakterklasse, die alle Werte speichert.
Der Player ist vom Charakter abgeleitet und guckt prinzipiell nur jede Frame ob eine Usereingabe vorhanden ist und startet danach die entsprechenden Aktionen.
Ki wird auch abgeleitet von Charakter und überlegt sich dann halt n paar kleinere Sachen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 07:10    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
@Hazle
Klingt irgendwie sehr kompliziert. Könntest du mir evtl. n kleines Beispiel geben?
Also ich habe ja jetzt schon Aktionen in extra Klassen. Dann hab ich eine Modellklasse, für die Darstellung und halt meine Charakterklasse, die alle Werte speichert.
Der Player ist vom Charakter abgeleitet und guckt prinzipiell nur jede Frame ob eine Usereingabe vorhanden ist und startet danach die entsprechenden Aktionen.
Ki wird auch abgeleitet von Charakter und überlegt sich dann halt n paar kleinere Sachen.


Alles klar, ich mach dir am WE ein klenes UML Diagramm. :-)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
fkrauthan
Junior JLI'ler


Alter: 33
Anmeldedatum: 10.04.2005
Beiträge: 96
Wohnort: Germering
Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 08:31    Titel: Antworten mit Zitat

was für UML software würdest du den für Linux empfehlen? Ich habe noch nichts gefunden was mich wirklich überzeugt.
_________________

"Die Codeschleuder" das Spieleprogrammierer Magazin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 22.03.2008, 09:46    Titel: Antworten mit Zitat

fkrauthan hat Folgendes geschrieben:
was für UML software würdest du den für Linux empfehlen? Ich habe noch nichts gefunden was mich wirklich überzeugt.


Hi! Ich benutze Violet... sollte auch unter Linux funktionieren, da es ein Java Programm ist. Integriert sich auch super in Eclipse. Was ich an Violet besonders toll finde ist, dass man nicht mit nervigen Fenstern genervt wird. Man kann super schnell ohne viel Arbeit UML Skizzen basteln.

Ansonsten... Papier und Bleistift sind immer noch die besten Tools, die je erfunden wurden. Man muss nicht vorm PC Hocken und es gibt keine Vorgaben und Grenzen. ;-)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 01:14    Titel: Antworten mit Zitat

Folgendes weißt du vermutlich bereits. Da mir beim Querlesen folgende C++-Befehle nicht íns Auge gesprungen sind, führe ich sie kurz auf:

Ich verwende in meinem Programm folgende Konstruktionen:

CPP:
class CMolecule
{
public:
   // This class needs access to the members of this class
   friend class CSimulation;


Damit kann ich in der CSimulation-Klasse auf private-Elemenente und Funktionen der CMolecule-Klasse zugreifen, da ich diese Werte dort ständig brauche.

Darüber hinaus habe ich static-Variablen und static-Funktionen die ich beispielsweise wie folgt aufrufe:

CPP:
CMenuSetting::GetEditState()
CMenuSetting::SetEditState()


Da diese Funktionen/Variablen static sind, brauche ich keinen Zeiger, sondern kann über den Klassenname direkt auf diese Werte/Funktionen zugreifen.

Natürlich muss man static-Variablen am Anfang der cpp-Datei initialisieren, da diese Variablen auch ohne eine Klasseninstanz existieren.
Dies verwendet man z.B. um einen Zähler für die Anzahl der Instanzen einer Klasse zu verwenden (Für Spieler-Attribute könnte man dies verwenden)

Anfang von MenuSetting.cpp:

CPP:
#include "MenuSetting.h"

EShowBondDetails CMenuSetting::m_ShowBondDetails = Yes;


EShow... ist eine Enumeration und "Yes" ein Wert davon.

Anfang von MenuSetting.h:

CPP:
//////////////////////////////////////////////////
// Diese Klasse speichert die Menüeinstellungen //
//////////////////////////////////////////////////
#if !defined(MenuSetting_h)
#define MenuSetting_h

#include "global.h"
#include "Molecule.h"

class CMenuSetting
{
public:
   static void SetShowBondDetails(EShowBondDetails Typ);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 09:07    Titel: Antworten mit Zitat

http://tutorial.schornboeck.net/friend.htm

Zitat:
http://tutorial.schornboeck.net/friend.htm


Ich bin mir nicht ganz sicher, ob ich bis zu 20 Klassen als friend deklarieren möchte. Den es könnte schon eine Menge Aktionen geben.
Desweiteren benutze ich eine von Character abgeleitete Klasse Player, soweit ich weiß, müsste diese dann auch die was weiß ich wie viele Aktionen als friend deklariert haben. Ebenso NPC und sonstige Spezialisierungen von Character.

Viel schöner wäre es, wenn man friend vererben könnte, dass also der Character Action als friend hat und damit auch sämtliche von Action abgeleitete Klassen Zugriff auf Private Elemente haben.

Gibt es sowas nicht vielleicht doch irgendwie?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 13:39    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
http://tutorial.schornboeck.net/friend.htm

Zitat:
http://tutorial.schornboeck.net/friend.htm


Ich bin mir nicht ganz sicher, ob ich bis zu 20 Klassen als friend deklarieren möchte. Den es könnte schon eine Menge Aktionen geben.
Desweiteren benutze ich eine von Character abgeleitete Klasse Player, soweit ich weiß, müsste diese dann auch die was weiß ich wie viele Aktionen als friend deklariert haben. Ebenso NPC und sonstige Spezialisierungen von Character.

Viel schöner wäre es, wenn man friend vererben könnte, dass also der Character Action als friend hat und damit auch sämtliche von Action abgeleitete Klassen Zugriff auf Private Elemente haben.

Gibt es sowas nicht vielleicht doch irgendwie?

Nein, friend ist nicht vererbbar, wie du oben schon vermutet hast. Etwas Ähnliches, das vererbbar ist, gibt es leider nicht. Für die die sich fragen warum folgenden Vergleich: Ein Mensch hat einen guten Kumpel der ihn auf Alles Anspruch haben lässt was er selber besitzt. Jetzt bekommt dieser Mensch einen Sohn. Heißt das zwingend, dass der Sohn und alle weiteren Söhne von diesem Sohn genau die gleichen Ansprüche auf die Sachen des Kumpels hat wie der Mensch am Anfang? Wäre ziemlich seltsam Razz

Zum Problem: Wenn du schon so weit bist und das meiner Meinung nach auch wunderbar aufgebaut hast (vom OOP-Sinn her), würd ich an deiner Stelle einfach den unkompliziertesten Weg nehmen den GreveN schon vorgeschlagen hat: In der Struktur neben den eigentlichen Werten Referenzen auf die Basiswerte definieren. Wieso jetzt stundenlang überlegen wie man das anders lösen kann? So sieht es von außen so aus (und man benutzt es auch so), dass alle Werte in der Struktur zusammengefasst sind (was übrigens auch nicht schlecht ist). Schaut man genauer nach, sieht man, dass einiges Referenzen sind, aber das muss den Kunden gar nicht stören. Er benutzt es einfach als vorhandenen Wert und sieht nicht was dahinter abläuft. Wenn er trotzdem will, so kann er ja nachschauen Smile

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 13:42    Titel: Antworten mit Zitat

Naja, ich fände es schon sehr gut, ein vererbbares friend zu haben. Optional. Ich meine C++ ist doch so designt dass man alles kann, aber nix muss.
Außerdem, wenn ich was vom Freund meines Vaters will, dann frag ich den einfach und dann krieg ich das Very Happy

Naja, ich habs jetzt mit der Struktur gemacht. Mal sehen ob ich dabei bleibe Very Happy Ich hänge noch halb bei der Lösung mit 20 friend Deklarationen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 14:12    Titel: Antworten mit Zitat

Jonathan_Klein hat Folgendes geschrieben:
Naja, ich fände es schon sehr gut, ein vererbbares friend zu haben. Optional. Ich meine C++ ist doch so designt dass man alles kann, aber nix muss.
Außerdem, wenn ich was vom Freund meines Vaters will, dann frag ich den einfach und dann krieg ich das Very Happy
Richtig, und diese Frage lässt sich wunderbar als get-Methode implementieren Razz

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
User_User
JLI'ler



Anmeldedatum: 05.08.2004
Beiträge: 137

Medaillen: Keine

BeitragVerfasst am: 23.03.2008, 19:41    Titel: Antworten mit Zitat

Jonathan_Klein hat geschrieben:

Zitat:
Naja, ich fände es schon sehr gut, ein vererbbares friend zu haben. Optional. Ich meine C++ ist doch so designt dass man alles kann, aber nix muss.


DirectXer hat geschrieben:

Zitat:
Richtig, und diese Frage lässt sich wunderbar als get-Methode implementieren


Kann man das nicht durch Textersetzung steuern (z.B.: ein Makro oder #include), sodass man sich viel Schreibarbeit erspart?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum