Wie eigene Lib einbauen?



  • Also ich baue grad an einem Rollenspiel, siehe www.die-gaming.de .
    Das ganze besteht eigentlich aus mehreren Teilen:

    Ein Content Management System für das Rollenspielsystem in PHP auf www.die-gaming.de sowie das Rollenspielsystem in einer mysql Datenbank - soweit Fertig(ausser dem Design :P)

    Eine Rollenspielsystemlibrary in C++, teils automatisch erzeugt aus den Daten von www.die-gaming.de und teils von Hand programmiert - werdich heute Nacht denkich irgendwann mit fertig, reines Standard C++

    Ein Leveleditor der die Library benutzt - Mit Borland C++ Builder, grösstenteils fertig

    Das Spiel ansich - arbeitet mit SDL, benutzt auch die lib, eher weniger fertig 😉

    -------

    Ich frag mich jetzt nur wie ich am besten das Rollenspielsystem einarbeite...
    Da das ganze Spiel ziemlich Betriebssystemunabhängig sein wird(ausser SDL und Standard C++ benutz ich nix, mal abgesehen vom Editor) wäre es schade wenn das ganze verloren geht nur weil ich eine dll include oder so...
    Andererseits werden da sehr oft Balanceveränderungen kommen am System...

    Also mit würden 3 Möglichkeiten einfallen die alle nicht so super sind:

    über dll:
    Vorteil:
    -man muss nur die dll austauschen um neue Daten in Editor/Spiel reinzubekommen

    Nachteil:
    -Da spielt nur Windows mit

    Über statische libs oder direktes includen vom Source:
    Vorteile:
    -Alles beisammen
    -läuft überall
    Nachteil:
    -Bei jeder Änderung Editor und Spiel neu compilieren... wenn dann jemand eine Änderung braucht, also der Goblin mal 10 HP weniger haben soll und er keinen Compiler/aktuelle Sources hat ist er ohne mich aufgeschmissen 😃

    Eigenes Format für die Daten bauen (Text/Binaryfile):
    Vorteile:
    -Zum Laden von neuen Monstern usw in den Editor ist keine Veränderung an der Exe erforderlich.

    Nachteile:
    -Wenn nicht superperfekt optimiert vergleichsweise ziemlich langsam
    -Hackanfälliger
    -Fehleranfälliger
    -Quellcode wird unübersichtlicher

    Also meine Frage ist einfach:
    Was würdet ihr machen?
    Wie würdet ihr die Monsterlib in den Editor und das Spiel einbauen?
    Soll ich sie direkt includen? Soll ich eine dll bauen? Oder doch mein eigenes Format ausdenken? Oder was anderes?



  • wenn du das Projekt auf einer anderen Platform benutzen willst, dann musst du doch eh das ganze System recompilen und dann muss man eben die dynamisch ladbare library so erstellen, wie das auf dem Zielsystem funktioniert. Unter Linux erstellt man dann eben eine *.so, anstelle einer DLL.

    Deswegen versteh ich dein Problem nicht ganz.



  • Das Problem ist das ich mich nicht entschieden kann wie ich das im Endeffekt mache 😃
    Sprich ob eine dll Sinn machen würde.

    Wenn ich das direkt reincompiliere hab ich den dll mist garnicht am Hacken und müsste einfach "nur" neu compilieren.
    (ich denk mal ein paar kleine Veränderungen braucht es eine dll zur so zu machen oder? )

    Nur wegen jeder kleinen Änderung eine neue exe erstellen ist auch schlecht, vorallem da ich nicht ganz alleine dran rumbaue =[



  • ich würde eine dll bevorzugen, da du so mehrere Vorteile hast

    1. Compile Zeit verkürzung, da du nur die DLL neu erstellen und ersetzen musst
    2. leichte Wartbarkeit (okay, unter Windoze nicht unbedingt), du musst nicht immer die komplette Anwendung austauschen
    3. Code Teilung, die DLL kann ja von mehreren Anwendungen gleichzeitig benutzt werden und muss nur einmal in den RAM geladen werden



  • ich hab erst mit der Spieleprogrammierung angefangen, würde aber raten die ganzen Konstanten in eine Textdatei zu packen.



  • das mit textdatei wär irgendwie blöd wegen der Masse.

    Sowie ichs jetzt hab sag ich einfach
    MONSTER neues_monster(MONSTER_WALDWOLF, 5); (5 steht für Stufe)
    und dann hab ich son ding inklusive Rasse, Klasse, Zusatzdaten, fertig berechneten Statuswerten uswusw.

    Bei ner Textdatei müsste ich die Dinger entweder rausfischen wenn ich sie brauche(das heisst jedesmal ne mehrere mb grosse Datei durchwühlen) oder ich lad die Dinger beim Start ins Ram, was bei mehreren mb aber auch net so das Wahre wäre, reicht schon wenn ich das mit den Leveln machen muss :D.

    Ich denk mal ich benutz das erste mal in meinem Leben eigene dll´s 😃
    Und die Leutz die was ändern wollen sollen dann eben den Kram im www ändern, aufer website aufs "Quelltexte erstellen" Knöpfchen drücken und die Dateien runterladen, eben Devc++ oder so runterladen, durchcompilieren und dann die dll ins Editorverzeichnis kopieren.



  • Wenn Dir die Textdateien zu groß sind dann könntest Du binär speichern, dann aber einen Editor dazu basteln mit dem man alles einstellen kann. Aber der Vorteil von den Textdateien liegt auf der Hand, man muss nichts neu kompilieren, ist portabel in alle erdenklichen PC-Zeichensätze. (vielleicht wird es Probleme zwischen Unicode und ANSI/ASCII geben). Und im Vergleich zu Binaries Prozessorunabhängig (wegen Big Endian/Little Endian). Bei den DLLs ist das Spiel auf Windows beschränkt. Und das Argument mit unübersichtlicher Struktur finde ich unpassend, denn man kann alles in Klassen kapseln. Ich vermute dass Du sogar schon jetzt die Konstanten nicht direkt über ihren Wert, sondern über einen Namen verwendest, wieso dann auch nicht gleich diese auslagern.
    Eine Klasse um diese zu verwenden könnte so aussehen:

    class CSettings
    {
    public:
       string& getValue(const string& key) const;
    };
    

    Aber es ist Deine Entscheidung wie Du es am Ende machst, ich will und kann Dir nichts vorschreiben, nur vorschlagen. 😉



  • kingruedi hat es schon gesagt.

    Das hat alles nichts mit deinem Spiel zu tun sondern mit den Vorteilen von DLL/SO.

    Der Editor funkt ja eh nur unter Windows. Für Linux musst du ihn sowieso neu Compilieren.

    Beim starten des Editors kann man aus dem Internet nach einer neuen DLL/SO suchen und diese gleich dem USER anbieten.

    Die DLL muss aber mit LoadLibrary geladen werden sonst läßt sie sich nicht so einfach austauschen.



  • Also einen Editor wo ich alles einstellen kann will ich gar nicht!

    Ich mag diese Situation nicht:
    Leveldesigner1 : "Ich hab Monster xxx verändert"
    Leveldesigner2 : "Ich auch"
    Leveld.1 : "Mein geniales grad gebautes Level läuft nur mit den von mir eingestellten Werten"
    Leveld.2 : "Meins auch"
    Leveld.1 : "Also gut dann versuchen wir uns jetzt zu töten und wer am Ende noch lebt dessen Einstellungen werden übernommen"

    Oder man stelle sich vor 2 Leute fügen ein neues Monster hinzu, jeder in seiner Textdatei... was dann wenn man den Kram zusammenfügen will?
    Lustiges Textdateienzusammenkopieren?

    Da findich den Ansatz über die Webseite schon ganz gut, dann muss man das zentral ändern.
    Ausserdem kann man es überall machen, auch unter Linux oder sonstwas wenns sein muss und vorallem ohne Fremdprogramme ^^



  • Schon an Kosten, die dabei entstehen können, gedacht? 😉



  • Was für Kosten 😕

    Also ums Trafficlimit mach ich mir keine Sorgen, das bisschen cpp Datei runterladen kostet nix 😃

    Man braucht ja auch immer nur die die man verändert hat. (wieso monster.cpp runterladen wenn man eine neue Rasse gemacht hat)

    Ausserdem dürfen eh nur staffies die Dateien neu erzeugen und das sind nicht soviele als das das auffallen würde selbst wenn die die Dateien 30 Tage im Monat jede Stunde generieren und runterladen würden.



  • wenn es nur um Konstanten geht, dann würde ich aber auch eine Textdatei nehmen, da man diese leichter editieren kann

    Lustiges Textdateienzusammenkopieren?

    das gleiche passiert auch, wenn 2 Leute die DLL ändern. Aber dafür gibt es mittlerweile ausgeklügelte Lösungen (siehe CVS, GNU/patch, GNU/diff), so dass du dir darum keine Sorgen machen musst



  • Das ganze ist ein ziemlich komplexes Klassensystem mit allerlei Methoden und wird sehr oft gebraucht werden.

    Die Methoden bau allerdings nur ich und die bleiben auch gleich ausser wenn ICH die ändere oder erweitere.

    Und das mit dem dll auseinanderlaufen geht eben NICHT weil jeder der eine Änderung vornimmt diese erst in der Datenbank auf dem Webserver eintragen muss.
    Da kann dann nichts auseinander laufen.
    Noch weniger als bei CVS Nutzung.

    Ich kann da im Konstruktor zwar genauso sagen
    "load_from_file(MONSTER_WALDWOLF, "monster.dat")" aber dann wird das ganze auf jeden Fall um einiges langsamer und jeder kann mit der monster.dat komische Sachen anstellen, im Zweifelsfalle ich selber(oops wegen Konstallation xxx sind alle Monster jetzt um einen versetzt son mist).
    Das ganze kann ja mal locker auf 300 Monster anwachsen und wenn ich dann Monster 300 haben will.. soll ich dann erst die vorigen 299 durchsuchen?
    Ein Monster pro Zeile wird nix, dazu hab ich zu lange Kommentare dazu.
    und ein "du bist nicht das Monster was ich haben will, nächster, du auchnicht, nächster" ist auch blöd.



  • hö? Du benutzt einfach ein anderes Format und machst dann eine Funktion

    std::map<std::string,std::auto_ptr<monster> > lade_monster(const char *dateiname);
    //oder vielleicht (wenn monster nicht polymorph ist)
    std::map<std::string,monster> lade_monster(const char *dateiname);
    

    die dir einfach alle Monster aus der Datei lädt. Die Lösung ist fürs Editieren auf jeden Fall komfortabler.

    Das mit dem Eintrag in der DB versteh ich nicht, ist doch das gleiche bei einer Text Datei



  • Ja nur ist die Datenbank zentral und nur ein mal(!) auf www.die-gaming.de

    Könnte man die Offline editieren , sprich holt sich jeder die grad aktuelle (Text)Datei ab, wurstelt die fleissig um und ich weiss dann nicht mehr wie ich die wieder in die Datenbank bekomme.

    Die muss aber in die Datenbank rein, erstens weil ich auch an einem Browsergame arbeite was darauf basiert und zweitens weil die Seite als Nachschlagewerk dient was es denn so für Monster gibt usw.



  • dreaddy schrieb:

    Was für Kosten 😕

    Nicht jeder hat eine Direktverbindung zum Internet, bzw. eine Flatrate, bzw. DSL-Volumentarif.



  • wenn es sich eh um ein Online Spiel handelt, dann kann das Programm die Monster Informationen direkt aus der DB runterladen. Ist doch sogar noch besser, dann hast du kein Problem mit Leuten, die ihr Programm nicht updaten etc.



  • Jeder der mir hilft hat eine flat, also das passt schon, ausserdem soll sich da nachher gar nicht mehr soviel ändern.
    Und eine Idee ist ja auch das jeder Fremde der Lust hat mal im www schnell ein Monster adden kann(das natürlich erst freigeschaltet werden muss).

    Und nein es ist kein Online Rollenspiel sondern ein "normales" 2d Offline Rollenspiel.
    Aber ein Browsergame habe ich in meinem grenzenlosen Optimimus auch noch vor zu bauen, deshalb müssen die Daten sowohl Online(für Online game, Handbuch) und Offline(fürs Offline game) verfügbar sein und vor allem überall gleich sein.



  • dreaddy schrieb:

    Jeder der mir hilft hat eine flat, also das passt schon

    Auch jeder der das Spiel spielt?, oder werden sie lokal eine Kopie der Datenbank haben, die man dann manuell downloaden kann.



  • Nein, die Datenbank brauch ich nur für folgendes:
    - Zur Entwicklungszeit um neue Monstertypen, Heldentypen, Rassen, Klassen, Items usw hinzuzufügen
    - zum Handbuch generieren(also die Monsterlisten usw)
    - fürs Browsergame wenns denn mal soweit kommt

    Aber NICHT für das PC Spiel

    Das erzeugt nämlich aus der Datenbank einmalig auf Knopfdruck mehrere cpp und h Dateien (oder halt ein eigenes Format) die dann reincompiliert werden.
    Und die enthalten dieselben Daten wie in der Datenbank stehen, also die Werte der MOnster, Items usw.
    Ausser zum Updaten neuer Monster usw braucht das Internet dann keine Sau mehr fürs PC Game.


Anmelden zum Antworten