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

storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

1

19.02.2012, 19:04

Rendern mit Screens

Servus Jungz,

ich bin gerade dabei mittels verschiedenen Screens in SFML zu Zeichnen. Ein Screen enthält alle Objekte die gezeichnet werden müssen im jeweiligen Screen.

Ich habe eine Basisklasse geschreiben:

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
#include <SFML\Graphics.hpp>
#include "RessourceManager.h"

#ifndef RENDERSCREEN_H
#define RENDERSCREEN_H

enum ScreenState {
    IDLE,
    ACTIVE,
}

class RenderScreen
{
protected:
    RessourceManager *m_pRessources;
    int m_iState;
public:
    RenderScreen(void);
    virtual ~RenderScreen(void);
    virtual void Update(const float elapsedTime) = 0;
    virtual void Render(sf::RenderWindow * window) = 0;
    int GetState(void);
    void SetState(ScreenState state);
};

#endif


In meiner Game Klasse möchte ich dann einfach eine Liste einführen welche durchlaufen wird und je nach State Zeichnet oder eben nicht. Um aber eine Liste nutzen zu können müssen ja alle den selben Typ haben in dem Fall RenderScreen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//Member in Gameklasse
std::list<RenderScreen*> m_lScreens;

// Initialize Funktion von Game Klasse
this->m_lScreens.push_back(new IntroScreen(bla));
this->m_lScreens.push_back(new MenuScreen(bla));
this->m_lScreens.push_back(new IngameScreen(bla));
this->m_lScreens.push_back(new GameOverScreen(bla));


Jetzt ist meine Frage ob dies so eine gute Handhabung ist oder ob es andere Optionen gibt.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

19.02.2012, 19:35

Es ist nicht schlecht. Ich würde aber einen std::vector (oder je nachdem wie du die Screens ansprechen willst eine Map) nutzen, RessourceManager im Header nur deklarieren und nicht einbinden und der Rendermethode eine Referenz anstelle des Zeigers übergeben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

3

19.02.2012, 19:44

Also ich setze in der Basisklasse den RessourcenManager nur auf "NULL" und im Destruktor mache ich das selbe falls es nicht NULL ist.

Warum sollte ich lieber eine Referenz nehmen anstatt eines Pointers?
Ich nutze in der Rendermethode die Klasse RessourcenManager nicht, sondern zum initializieren der einzelnen Sprites, der RessourceManager enthält nur die Texturen von sf::Texture, welche in einer Map verwaltet werden und eine Referenz zurückgegeben wird und jede Textur nur einmal lädt.


Definieren tue ich den RessourceManager in den Abgeleiteten Klassen im Konstruktor. Ich sehe gerade das es mit List gar nicht möglich ist wie ich das möchte.
z.B.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
std::list<RenderScreen*>::iterator itUpdate;
for (itUpdate = m_lScreens.begin(); itUpdate != m_lScreens.end(); itUpdate++)
{
    if (itUpdate->GetState == ACTIVE)
    {
        itUpdate->Update(this->m_ElapsedTime);
    }
}


Ich kann über den Iterator gar keine Funktion aufrufen, habe ich da was falsch vertsanden bzw. gemacht? Intellisense lässt mich meine Funktionen nicht auswählen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

19.02.2012, 19:48

Also ich setze in der Basisklasse den ressourcenManager nur auf "NULL" und im Destruktor mache ich das selbe falls es nciht NULL ist.

Den Satz versteh ich nicht...

Du musst den Zeiger UND den Iterator dereferenzieren.
Das geht so: (*itUpdate)->Update(this->m_ElapsedTime);
oder so: (**itUpdate).Update(this->m_ElapsedTime);
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

5

19.02.2012, 19:50

Hier das meinte ich

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
#include "RenderScreen.h"


RenderScreen::RenderScreen(void)
{
    this->m_iState = IDLE;
    this->m_pRessources = NULL;
}

RenderScreen::~RenderScreen(void)
{
    if (m_pRessources != NULL)
        m_pRessources = NULL;
}

int RenderScreen::GetState(void)
{
    return this->m_iState;
}

void RenderScreen::SetState(ScreenState state)
{
    this->m_iState = state;
}

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

19.02.2012, 19:53

Was soll das bringen?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

7

19.02.2012, 20:02

Naja das der Zeiger nicht mehr auf etwas zeigt was nicht mehr existiert, so wird es doch auch in meinem Buch gemacht.

Ach ja warum sollte der RessourcenManager als referenz übergeben werden und weshalb der Funktion Render?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

19.02.2012, 20:11

Könntest du bitte versuchen etwas deutlicher zu schreiben?

Wer oder was könnte den ungültigen Zeiger nach dem Destruktoraufruf noch benutzen? Du brauchst ihn also nicht auf NULL setzen.
Abgesehen davon wäre es schneller wenn du die Bedingung weg lässt und einfach nur auf NULL setzt. Solltest du davor aber nicht delete aufrufen? Die Klasse, die den Zeiger enthält sollte auch die Freigabe seines Inhalts verantwortlich sein.

Einen Zeiger übergibt man nur dann als Parameter, wenn es auch möglich sein soll, dass du nichts(NULL) übergibst. Den Fall, dass der Zeiger NULL sein könnte MUSST du dann aber behandeln. Ich gehe mal davon aus, dass die Rendermethode das RenderWindow in jedem Fall benötigt. Benutze also eine Referenz.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

storage

Treue Seele

  • »storage« ist der Autor dieses Themas

Beiträge: 138

Wohnort: Bad Salzungen

  • Private Nachricht senden

9

19.02.2012, 20:25

Ja der RessourcenManager wird in der Game Klasse erzeugt und das auf dem Stack und wird nur als Pointer an die Screens übergeben somit wird er automatisch zerstört wenn das Spiel geschlossen wird und damit ist kein delete nötig, zumindest nicht nach meiner Auffassung.

Ja mit den NULL könntest du recht haben, mache dies auch nur sicherheitshalber, tut ja nicht weh das es da steht.

Und danke dir erstmal, hast mir schon sehr weitergeholfen und es läuft im moment alles wie es soll.

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

10

19.02.2012, 20:45

Ja mit den NULL könntest du recht haben, mache dies auch nur sicherheitshalber, tut ja nicht weh das es da steht.


Wenn das Objekt nach dem destruktur aufruf noch verwendet wird, dann hast du ganz andere Probleme ;)

Werbeanzeige