öhmsen, son paar generelle Fragen



  • Geht hauptsächlich um Klassen.
    Also wie ichs im Moment mache, habe ich eine d3d, dsound etc Klasse und eine Klasse für jeweils weitere Dinge (eine fürs Hauptmenü, eine für Optionen etc etc).
    Eine Klasse für das Spiel selber hab ich mir gespart, weil.. kA irgendwie braucht man ja eh niemals mehrere Instanzen oder das Spiel mal zu laden oder zu entladen während das Spiel lauft oder son Schrott 😮 egal.

    Also.
    1. Macht es Sinn, die jeweiligen Klassen im Speicher zu registrieren, wenn man sie benötigt, sprich also ich habe einen globalen Pointer à la cd3d* g_d3d;
    Dann, sobald ich mein d3d brauche, mache ich ein "new" druf und hol mir den Speicher in den Pointer.
    Wenn ich jetzt z.B. das Hauptmenü brauche, mache ich ein
    g_mmain = new cmmain;

    Sobald ich ein andere Menü brauche, lösche ich die Hauptmenü Klasse wieder.

    Jetzt meine Frage, macht es Sinn? Ich müsste doch dann theoretisch mehr Speicher für das Spiel über haben, wenn ich die Klassen dann immer initialisiere wenn ich sie brauche, oder?
    Oder ist es besser, am Anfang einmal alle Klassen zu initialisieren, und sie dann im Speicher zu behalten?

    2. Jetzt gehts um D3d. Ich mein, es zu initialisieren ist ja kein Problem, ich hab auch schon ne schöne Renderfunktion mit ner Zeitkontrolle usw usf. Ích hätte dann einmal mein d3d->render(ftime).
    Das hab ich so programmiert ohne wirklich nachzudenken, und jetzt hab ich ein Problem.
    Wenn ich meine Surfaces, Texturen etc in den jeweiligen anderen Klassen habe, z.B. eine Textur fürs Hauptmenü etc, sollte ich dann eine Zentrale Renderfunktion in meiner d3d Klasse haben, oder in jeder Klasse eine eigene Renderfunktion einbauen?

    Wenn ich nun eine Gamestate Abfrage in meiner zentralen Renderfunktion habe, dann kann ich immernoch nicht auf andere Klassenobjekte zugreifen, es sei denn ich überliefere die ganze Klasse als Argument an meine d3d->render Funktion. Zumindest krieg ich einen Fehler, wenn ich auf globale Klassen in einer d3d Methode wie render() zugreife.
    Jau, wie siehts aus, wie macht ihr das?

    Im Moment hab ich nur Angst irgendwie, dass ich am Ende in jede Klasse eigene d3d Funktionen reinschreibe und mir die d3d Klasse dann spare.

    Ich skizziere mal was ich meine.

    ----------
    |cmmain  |
    ----------
    |render()|<---------|   --------------
    |move()  |          |   | cd3d       |
    ----------          |   --------------
                        ----|LPDIRECT3D9 |
    -----------             |DIRECT3D9Dev|
    cmoptionen|         |---| etc.       |
    |---------|         |   --------------
    |render() |<--------|
    |move()   |
    -----------
    

    Das wäre eine Möglichkeit. Die andere wäre

    ----------
    |cmmain  |
    ----------
    |Vektor  |----------|   --------------
    |Textur  |          |   | cd3d       |
    ----------          |   --------------
                        --->|Render()    |
    -----------             |            |
    cmoptionen|         |-->|            |
    |---------|         |   --------------
    |Vektor   |---------|
    |Textur   |
    -----------
    

    1. Also wenn ich Beispielsweise eine Renderfunktion in cmmain einbaue, dann müsste ich doch z.B.
    das LPDIRECT3DDEVICE9 m_pdevice von cd3d benutzen.
    Wie mache ich das. Mit globalen Variablen? Meine Instanz von cd3d ist ja global, aber wie greife ich in einer Methode drauf zu?
    Eine Alternative wäre dann ja, den Pointer auf meine cd3d Klasse in einem Argument an die Rendermethode des cmmain zu übergeben. Das müsste ja dann funktionieren, weil ein Pointer doch nur auf den Speicherbereich zeigt, und ich den dann manipulieren kann.
    ICh würde es gerne wie in Skizze 1 haben. Sprich, ich kann zwar mein BeginScene() etc in meiner cd3d haben, diese aber innerhalb meiner mmain->render() aufrufen.
    Wie hat das in c++ genau auszusehen.

    Sollte ich euch jetzt total verwirrt haben, tut es mir leid, aber ich bin auch selbst recht verwirrt



  • // Dieses Post ignorieren



  • zu 1

    Jetzt meine Frage, macht es Sinn? Ich müsste doch dann theoretisch mehr Speicher für das Spiel über haben, wenn ich die Klassen dann immer initialisiere wenn ich sie brauche, oder?
    Oder ist es besser, am Anfang einmal alle Klassen zu initialisieren, und sie dann im Speicher zu behalten?

    "It depends."

    zu 2
    Du hast einen Wrapper um DX gebaut? Ich halte es nicht für sinnvoll, das der Wrapper nur eine solche Render Methode hat. Das würde sowas bedeuten wie "Zeichne dich selbst", aber wie soll ein Wrapper sich denn selbst zeichnen? Wenn, dann sollte es eine Methode wie Draw( GraphicObject& Bla ); oder Draw( PrimitiveList& Blubb ); geben.

    P.S.: Bitte ordentliche Threadtitel wählen.

    Bye, TGGC \-/



  • Ich würde die klassen die nur einmal da sind z.b. das spiel selbst und die d3d klasse die du immer übergeben möchtest, als Singleton konstruieren, so mußt du sie nie übergeben und kannst dir sicher sein dass es trotzdem immer nur die eine klasse ist.

    aber eigentlich ist es kein graphisches bzw spieleprogrammier-problem, ich schieb dich ma ins c++ forum.

    rapso->greets();



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • TGGC schrieb:

    zu 1

    Jetzt meine Frage, macht es Sinn? Ich müsste doch dann theoretisch mehr Speicher für das Spiel über haben, wenn ich die Klassen dann immer initialisiere wenn ich sie brauche, oder?
    Oder ist es besser, am Anfang einmal alle Klassen zu initialisieren, und sie dann im Speicher zu behalten?

    "It depends."

    zu 2
    Du hast einen Wrapper um DX gebaut? Ich halte es nicht für sinnvoll, das der Wrapper nur eine solche Render Methode hat. Das würde sowas bedeuten wie "Zeichne dich selbst", aber wie soll ein Wrapper sich denn selbst zeichnen? Wenn, dann sollte es eine Methode wie Draw( GraphicObject& Bla ); oder Draw( PrimitiveList& Blubb ); geben.

    P.S.: Bitte ordentliche Threadtitel wählen.

    Bye, TGGC \-/

    Also im Moment läuft es so ab:
    Jede Klasse hat eine eigene Renderfunktion.
    Nun könnte ich natürlich auf eine d3d Klasse verzichten, aber da gibt es einfach soviel Zeug, was ich gerne in einer Klasse haben wollte.

    Also ich muss im Grunde irgendwie von einer Methode auf eine andere Klasse zugreifen (jo, das isn C++ Prob).
    Irgendwie musses möglich sein, aber ich peils einfach noch net.
    Könnte einer von euch mal ein Beispielprogramm hier reinschreibseln, wo man von einer Methode einer Klasse, auf Methoden oder Objekte einer anderen Klasse zugreift?

    Wär thx

    alternativ erklär mir mal das mit dem Signelton, kp was das bedeutet 😉

    danke.



  • Hi,

    class B
    {
    public:
    void machwas();
    };
    
    class A
    {
    public:
    void bla(B& b);
    };
    
    void A::bla(B& b)
    {
    b.machwas();
    }
    

    Hm :->

    Singleton ist son Teil, das nur einmal instanzierbar ist, dafür ist der ctor privat und es gibt nur eine Methode, die eine Instanz zurückgibt, meistens statisch in einer Funktion oder so...

    MfG Eisflamme



  • kthx, wie implementier ich sowas?



  • Suche nach "singleton pattern c++"...



  • hnk, sieht gut aus.
    Allerdings habe ich die teile logischerweise in unterschiedlichen cpps, hs.
    Ich krieg entweder ein "identifier" error, dachte mir dann evtl mal die .h der einen Klasse in die andere einzubinden.

    -- classb.h
    class B
    {
    public:
    void machwas();
    };
    -- classa.h
    #include "classb.h"
    class A
    {
    public:
    void bla(B& b);
    };
    -- classa.cpp
    void A::bla(B& b)
    {
    b.machwas();
    }
    

    Mh, jo da krieg ich ein class type redefintion.
    Woas is faul?



  • includest du in classa.cpp die file classa.h??



  • EinsDrei schrieb:

    Mh, jo da krieg ich ein class type redefintion.
    Woas is faul?

    It's your fault.

    Dieses Problem kann der Poster IMHO selbst lösen. Unter Umständen ist dazu eines der folgenden Hilfsmittel zu nutzen:
    - Dokumentation zur benutzen API
    - google
    - FAQ/Suche dieses Boards
    - Debugger
    - geringe Mengen Gehirnschmalz

    Dieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.

    Disclaimer: dies ist kein direkter persönlicher Angriff.

    Bye, TGGC (Reden wie die Großen)



  • Ach klar kann ichs irgendwie lösen, aber wozu sind Foren mit netten Leuten drin denn da?



  • Im übrigen: Wenn ich mit #pragma once oder #ifndef etc. redefinition verhindere, gehts natürlich.

    Aber ist das auch der "saubere" Weg?


Anmelden zum Antworten