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

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

10.01.2009, 20:50

[sfml] render window

Hi@all,
sry wegen der überschrift, aber mir ist nichts besseres eingefallen...

Hab 2 Fragen :

1. Ich wollt fragen ob ich eingentlich mein projekt dass ich angefangen habe(mit sdl^^) neu machen soll oder nur umändern soll da ich jetzt sfml^^ benutz

2. ich hab mein Projekt in so einzelne Klassen eingeteilt wie bei dem spiel in dem buch "c++ für Spieleprogrammierer"...ich hab eine player klasse und möcht dort z.b. den mausX und Y-Wert bekommen...da gibts so eine Funktion die ich glaub ich brauch um die werte zu bekommen "App.GetInput" nur dazu brauch ich das "App" dass ich mit render window erstellt hab und die is in einer anderen Klasse....nun wie kann ich es rüber holen in die playerklasse oder hat jm. ne andere idee...
ich wollte es mit GetScreen versuchen wo ich dann das "App" returne, aber irgendwie ging des nicht....oder gibts da ne bestimmte funktion in sfml??

Thx schonmal im voraus
New Project: Operation CityRacer

2

10.01.2009, 21:10

Du brauchst dafür ne Get Methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
#define Framework CFramework::Get()

class CFramework : public TSingleton <CFramework>
{
public:
       sf::RenderWindow *GetApp () {return m_pApp;}
       // Deine anderen Methoden


private:
       sf::RenderWindow *m_pApp;
       // Deine anderen Eigenschaften


};


App holst du dann folgendermaßen auf deine Funktion wo du das haben willst:

C-/C++-Quelltext

1
Framework->GetApp()->//Die jeweilige Funktion


(alles nicht getestet und hier geschrieben, müsste aber soweit gehen)

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

3

10.01.2009, 21:28

heidenei, ging aber schnell.... :shock:
New Project: Operation CityRacer

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

4

10.01.2009, 21:56

mir ist grad aufgefallen dass ich ein fehler bekommen wegen dem Render window....
wollt noch fragen wie ich die render window funktion erst im den privaten membervariablen intialisieren und dann in einer Elementfunktion deklarieren kann
weil wenn ich sf::RenderWindow App mach und in einer elementfunktion App(sf::VideoMode(800, 600, 32), "SFML Graphics"); kommt ein fehler :roll:
New Project: Operation CityRacer

5

10.01.2009, 22:05

meinst du das:

C-/C++-Quelltext

1
void Init   (int ScreenWidth, int ScreenHeight, int ColorDepth, std::string sTitle,  bool bFullscreen, bool bGetVideoMode);


(Prototypdeklaration für die Methode in der Klasse)

und das dann in einer extra Datei: (Methodendefinierung)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CFramework::Init(int ScreenWidth, int ScreenHeight, int ColorDepth, std::string sTitle,
                    bool bFullscreen, bool bGetVideoMode)
{   
    // Speicher für m_pApp reservieren

    m_pApp = new sf::RenderWindow;

        // Fenster erzeugen

    m_pApp->Create(sf::VideoMode(ScreenWidth, ScreenHeight, ColorDepth), sTitle);
}


// Edit: Nicht vergessen den Speicher freizugeben. Einfach durch Destruktor.

6

10.01.2009, 23:20

Zitat von »"raXor"«

// Edit: Nicht vergessen den Speicher freizugeben. Einfach durch Destruktor.
Du meinst durch delete? Wieso eigentlich eine Init-Funktion, wenn es Konstruktoren gibt? Zudem verwendest du zwei deiner Parameter gar nicht. ;)

Wenn du nur die Mauskoordinaten brauchst, finde ich es übertrieben, das ganze RenderWindow zurückzugeben. Schreib dir doch eine Funktion (Framework ist der Name der anderen Klasse, die das RenderWindow kennt):

C-/C++-Quelltext

1
2
3
4
sf::Vector2f Framework::GetMousePosition() const
{
    return sf::Vector2f(App.GetInput().GetMouseX(), App.GetInput().GetMouseY());
}

Oder halt zwei separate Funktionen für X und Y, je nachdem, was dir lieber ist.

7

11.01.2009, 00:38

Zitat von »"Nexus"«

Zitat von »"raXor"«

// Edit: Nicht vergessen den Speicher freizugeben. Einfach durch Destruktor.
Du meinst durch delete?

Ja, delete im Destruktor :)

Zitat

Wieso eigentlich eine Init-Funktion, wenn es Konstruktoren gibt?
Bei einer Singletonklasse verwende ich keine Konstruktoren, weiß auch nicht warum - ist einfach eine Angewohnheit.

Zitat

Zudem verwendest du zwei deiner Parameter gar nicht. ;)
Jup, aber man hat die Möglichkeit sie zu verwenden, wenn man sie gleich mit übergibt.

Zitat

Wenn du nur die Mauskoordinaten brauchst, finde ich es übertrieben, das ganze RenderWindow zurückzugeben. Schreib dir doch eine Funktion (Framework ist der Name der anderen Klasse, die das RenderWindow kennt):

Naja, ich halte es nicht für übertrieben - man kann es schließlich auch für andere Sachen verwenden wodurch man flexibler wäre.

Zitat


C-/C++-Quelltext

1
2
3
4
sf::Vector2f Framework::GetMousePosition() const
{
    return sf::Vector2f(App.GetInput().GetMouseX(), App.GetInput().GetMouseY());
}


Ja, eine Get Mouse Methode in der Klasse Framework wäre auch sinnvoll - bekanntlich führen ja mehrere Wege nach Rom.

8

11.01.2009, 00:49

Zitat von »"raXor"«

Zitat

Wenn du nur die Mauskoordinaten brauchst, finde ich es übertrieben, das ganze RenderWindow zurückzugeben. Schreib dir doch eine Funktion (Framework ist der Name der anderen Klasse, die das RenderWindow kennt):

Naja, ich halte es nicht für übertrieben - man kann es schließlich auch für andere Sachen verwenden wodurch man flexibler wäre.
Auf der anderen Seite muss man aber auch bedenken, dass man dadurch in der Player-Klasse enorm viel Macht erhält (sf::RenderWindow ist ja quasi das Zentralste in SFML). Meiner Ansicht nach zu viel, da schreibt man lieber einzelne Getter.

Wobei ich die Eingabe sowieso auslagern und nicht dem Player überlassen würde, aber das ist wieder ein anderes Thema. :)

9

11.01.2009, 01:11

Zitat von »"Nexus"«

Zitat von »"raXor"«

// Edit: Nicht vergessen den Speicher freizugeben. Einfach durch Destruktor.
Du meinst durch delete? Wieso eigentlich eine Init-Funktion, wenn es Konstruktoren gibt? Zudem verwendest du zwei deiner Parameter gar nicht. ;)
Ich hatte mit Konstruktoren schon hier und da ein paar Probleme. Ich weiß nicht mehr wann und warum, aber irgendwo hatte ich mal, dass sich der Konstruktor einer Singletonklasse mehrmals aufgerufen hat und alles in einer Endlosschleife hing. Ich glaub es war weil im Konstruktor mehrere tiefergelegenen Steuerungsschichten initialisiert wurden und diese dann Singleton::Get aufgerufen haben. (Wurd dann jedes mal neu erstellt) Einfachstes Workaround waren Initmethoden für alles was nicht sofort gemacht werden muss (Pointer auf 0, Referenzen und sowas) oder für kleinere Aufgaben.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

10

11.01.2009, 03:43

Zitat von »"Nexus"«

Wieso eigentlich eine Init-Funktion, wenn es Konstruktoren gibt?


Wir hatten ein C++ Praktikum, in welchem wir ne Init() schreiben sollten. Da wurden dann alle Member auf einen sinnvollen Defaultwert gesetzt um Speicherartefakte zu vermeiden. Ist im Endeffekt aber wohl nur sinnvoll um Schreibarbeit zu vermeiden, wenn man viele Konstruktoren hat. ;)

Gruß Marius

Werbeanzeige