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

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

31

04.09.2010, 13:53

Das ist schlechter Programmierstil!
Ich mache es immer so das ich eine Klasse habe , welche ein Singleton Pattern benutzt.
Damit kann ich dann die Klasseninstanz im ganzen Projekt verwenden wie ich lustig bin.

MfG Stazer

32

04.09.2010, 16:09

anstatt mir einfach zu sagen was genau falsch is kommen se alle mit irgendwelchen andren tipps, die ich garnicht erbeten habe -.-
hammer hart - schreib ich halt eben alles in die cgame::run() ...

33

04.09.2010, 17:51

anstatt mir einfach zu sagen was genau falsch is kommen se alle mit irgendwelchen andren tipps, die ich garnicht erbeten habe -.-
Ja genau, weil einige hier erkennen, dass das eigentliche Problem an deinem Quellcode ein ganz anderes ist und dir nun helfen wollen einige Probleme zu vermeiden.
Wenn du diesen Stil so fortsetzt, dann wirst du bald auf neue Probleme stoßen, die es erfordern große Teile deines Quellcodes neu zu schreiben, also machen wir dich jetzt schon darauf aufmerksam. Wenn dein Spiel nachher nur mit ein paar FPS läuft und zu viel Speicher braucht und Memoryleaks erzeugt, dann wunderst du dich.

Also nehm dir die Tipps lieber zu Herzen, als dich jetzt drüber aufzuregen.

Das RenderWindow übergibt man keiner Funktion, weil es dafür speicherintern kopiert werden müsste und das haufenweise Speicherplatz belegt und dein Spiel langsamer werden lässt. Man macht's aber genauso wenig global, vielleicht hast du das schon mitbekommen: Global = Böse!

Die Idee von Stazer mit dem Singleton ist eine Möglichkeit, lässt sich auch wieder drüber streiten, aber um einiges sinnvoller als einfach nur global.

Leg das RenderWindow am besten in einer Funktion SpielLaden() oder so an und speicher einen Zeiger auf das Objekt als Membervariable deiner Klasse CGame oder so etwas in der Art.

Man schreibt schlicht und einfach nicht alles in eine Funktion ( z.b. CGame::Run() ), das würde überhaupt nicht der C++ Programmierung entsprechen und genauso wenig Sinn machen.

Gruß
SaRu_

34

04.09.2010, 18:02

das ist doch mal was, danke!
und dass global böse ist, ist mir durchaus auch bewusst.
aber mir hat auch mal jemand gesagt, singletons seien auch böse ^^

und trotzdem find ich es momentan ziemlich egal ob die 5 zeilen event-kram jetzt in der game::run() habe oder in ner extra funktion. das kann ich wenns mich stört auch noch nachher in ne eigene funktion schreiben.

danke für deine hilfe, werds heut abend oder morgen ausprobieren.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

35

04.09.2010, 18:41

Warum erzeugst du es nicht einfach in der Init-Funktion und machst es zu einer Member der Klasse CGame? Für den Anfang würde ich an deiner Stelle auch nicht gleich eine perfekte Spieleklasse schreiben.
Aber ein bisschen mit Zeiger oder Referenzen musst du schon arbeiten können. Mache es z.B. so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "SFML/Graphics.hpp"
#include <iostream>
using namespace std;
#include "Game.h"

// sf::RenderWindow Fenster(sf::VideoMode(800, 600, 32), "World Hardest Game"); Objekte kann man hier sowieso nich erzeugen!

int main()
{
    CGame Game; // sf::RenderWindow Fenster; in Klassendekleration einfügen und Fenster im Konstruktor oder in Init() initialisieren
    Game.Init(); // kann jetzt auf Fenster zugreifen
    Game.Run(); // kann jetzt auf Fenster zugreifen

    return EXIT_SUCCESS;

}

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

36

04.09.2010, 20:31

Weswegen eig. alles in Klassen auslagern? Events abfragen und Fenster rendern kann man eben so gut in der Main Datei/Funktion.
Wenn eine Klasse dann das Fenster mal braucht um bspw. ein Sprite darauf zu zeichnen, kann man es ja per const referenz übergeben.
Zumindest handhabe ich Event abfragen stets in der Main Funktion, und üblicherweise auch den Teil mit dem Fenster Objekt.
Schätze, das ist wohl wieder reine Geschmacksfrage, was?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

37

05.09.2010, 11:03

Schätze, das ist wohl wieder reine Geschmacksfrage, was?

Nein eben nicht, das ist der Unterschied zwischen C (nicht objektorientiert) und C++ (objektorientiert). Die Vorzüge von Objektorientierung findest du sicherlich per Google wenn du nur den Begriff eingibst. ;)

Gruß
SaRu_

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

38

05.09.2010, 12:36

Schätze, das ist wohl wieder reine Geschmacksfrage, was?

Nein eben nicht, das ist der Unterschied zwischen C (nicht objektorientiert) und C++ (objektorientiert). Die Vorzüge von Objektorientierung findest du sicherlich per Google wenn du nur den Begriff eingibst. ;)

Gruß
SaRu_

Danke für diese kleine Einführung, OOP ist mir vertraut wenn ich Sprites, Maps oder etwaige Dinge kapsel die ich dann in der main Funktion zusammen führe ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

39

05.09.2010, 12:42

@ burningwaves vorschlag: das hatte ich auch schon einige male versucht, allerdings weiß ich nicht, wie ich das Fenster initialisiere, ohne ein komplett neues zu erzeugen.

im konstruktor:
sf::RenderWindow Fenster(sf::VideoMode(800, 600, 32), "World Hardest Game");

nach konstruktor:
sf::RenderWindow Fenster;
Fenster.[WAS?]

40

05.09.2010, 13:10

Hallo bewa,

Damit dein RenderWindow "überall" in deinem Programm zur Verfügung steht solltest du es auf dem Heap anlegen, das bedeutet mit dem Schlüsselwörtchen new. Dabei aber bitte auf keinen Fall vergessen, es am Programmende wieder freizugeben (mit delete) !

Hier ein Beispiel:

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
31
32
33
34
35
36
37
// Die Klasse
class CGame
{
public:
 bool Init();
bool Exit();
 sf::RenderWindow* GetWindow() { return Window; }

private:
 sf::RenderWindow* Window;

};

// Init...
bool CGame::Init()
{

Window = new sf::RenderWindow(sf::VideoMode(800, 600, 32), "World Hardest Game");

 // ...

 return true;
}

// Beispiel für's Rendern
Window->Draw(...);

// Exit...
bool CGame::Exit()
{

delete Window;
// Zeiger eventuell sicherheitshalber NULL setzen
Window = NULL;

 return true;
}


Gruß
SaRu_

Werbeanzeige

Ähnliche Themen