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

25.08.2014, 20:02

Arbeiten mit abstrakten Klassen

Hallo zusammen!

Ich habe folgende Frage:

Bei meinem Spiel habe ich eine Basis Klasse GameObject.
Die sieht in etwas so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class GameObject
{
    public:

    GameObject(const LoaderParams* pParams);

    virtual void draw();
    virtual void update();
    virtual void clean();
    
    Vector2D& getPosition() { return m_position; }
    Vector2D& getVelocity() { return m_velocity; }
    Vector2D& getAcceleration() { return m_acceleration; }
    
    protected:
    
    Vector2D m_position;
    Vector2D m_velocity;
    Vector2D m_acceleration;
    
    int m_width;
    int m_height;
    
    string m_sTextureID;
    
    int m_currentFrame;
    int m_currentRow;
    
    
};


Die Player-Klasse sieht dann etwa so aus und hat wie man sieht ihre
eigenen privaten Funktionen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Player : public GameObject
{
    
    public:
    
        Player(const LoaderParams* pParams);

        virtual void draw();
        virtual void update();
        virtual void clean();
        virtual void collision();
        virtual string type() { return "Player"; }
    
        void returnTest() { return test; }

    private:
    
        int test;
        void movements();
        void shiftColliders();
    
};


Nun meine Frage: Ist es möglich z.B. oben auf returnTest (angenommen test wäre statisch) zuzugreifen?
Falls ja wie steuere ich dorthin? Habe gerade die Durchsicht verloren ...

Auf public Funktionen von GameObjekt kann ich ja problemlos so drauf steuern:

C-/C++-Quelltext

1
2
3
4
for(vector<GameObject*>::size_type i = 0; i != pGameObjects.size(); i++)
{
 pGameObjects[i]->draw();   
}




Danke für eure Hilfe!

lg, Eric

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

25.08.2014, 20:08

Gar nicht. Du stellst da eine Anforderung, die keinen Sinn macht. Entweder reicht Dir GameObject als polymorphe Oberklasse und Du brauchst nur die Methoden, die sie anbietet oder sie reicht Dir eben nicht. In letzterem Fall macht eine polymorphe Verwaltung solcher Typen keinen Sinn.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

25.08.2014, 20:18

Ok danke für die Antwort. Wie löse ich dann das Problem, wenn ich auf variable Informationen wie zB SDL_Rect vektoren von verschiedenen GameObjekten fuer per-pixel kollision zugreifen will?

4

25.08.2014, 20:37

Du verstehst das Prinzip von Vererbung noch nicht.
Du kannst in einer Klasse nur auf die eigenen und vererbten Informationen zugreifen. Wenn alle spezifischen Gameobjekte eine gleiche Variable haben sollen, müssen entsprechend auch die Implementierungen von der Klasse erben, die genau diese Variable deklariert.
Im Code heißt das:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Base
{
public:
   virtual void DoSomething()
   {
       m_Rect = ...; // eigene Variable
   }
protected:
   SDL_Rect m_Rect;
};

class Derived : public Base
{
public:
   void DoSomething() // überschreibt Base::DoSomething(), da virtual
   {
      m_Rect = ...; // veerbte Variable
   }
};
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

5

25.08.2014, 22:55

Danke für die Antworten.
Jetzt hat es funktioniert. So sieht die Lösung aus:

Base-Klasse:

C-/C++-Quelltext

1
virtual vector<SDL_Rect> &getRects() { return mBaseColliders; };


Z.B. Player-Klasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
virtual vector<SDL_Rect> &getRects() { return mPlayerColliders; };

...


    mPlayerColliders.resize( 3 );
    mPlayerColliders[ 0 ].w = 80;
    mPlayerColliders[ 0 ].h = 20;

    (...)


...


Danke für die Hilfe.
Lg, Eric

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

28.08.2014, 06:06

Jetzt hat der Player zwei Vektoren. Warum benutzt er nicht einfach mBaseColliders?

7

29.08.2014, 08:12

Das ist wohl richtig. Der Spieler könnte den baseColliders verwenden. Aber für die anderen Klassen muss ich wohl schon einen eigenen Vektor erstellen, ansonsten habe ich Probleme im CollisionManager. Oder sehe ich das falsch?

Werbeanzeige