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

01.10.2012, 19:42

SFML 2.0 keine Textur?

Hallo,

kommen wir direkt zum Problem, ich habe eine Klasse namens "Object":

C-/C++-Quelltext

1
2
3
4
5
6
7
class Object
{
    private:

    sf::Texture texture;
    sf::Sprite sprite;
};

und eine Funktion, AUßERHALB der Klasse "Object", namens "function()"

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
std::list<Object> list;

// ...

void function()
{
   Object object;

   object.ladeTextur();

   list.push_back(object);
}

Diese Funktion rufe ich in der Main auf, das Ergebnis ist ein weißes Viereck in der Größe
der geladenen Textur. Wenn ich den Inhalt der Funktion "function()" einfach direkt in die Main tu, wird die Textur
ohne Probleme dargestellt. Daraus hab ich geschlussfolgert das allem Anschein durch das Scoping irgendwie dass Textur Objekt draufgeht...?

Wenn ich für das Textur Objekt in der Klasse "Object" im Konstruktor Speicher reserviere und diesen im Destruktor
NICHT freigebe, funktioniert alles wunderbar... Aber Memory Leaks möchte ich nicht so gerne...

Deshalb meine Fragen:
Hat jemand eine Ahnung woran das liegt und wie man das Problem löst? &&
Wieso geht nur die Textur drauf? (Alles andere funktioniert nämlich)

Vielen Dank schon mal im Voraus!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

01.10.2012, 20:12

Sieht so aus, als ob beim Kopieren deines Object das sf::Texture Objekt nicht richtig kopiert wird!? Oder vielleicht ein Bug in SFML!?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

3

01.10.2012, 20:20

Lass mich raten, du renderst wenn die Textur gar nicht mehr existiert? Dann gibt es nämlich diesen Fehler.

Schau mal, ob dein Renderaufruf außerhalb des Gültigkeitsbereiches der Textur liegt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

4

01.10.2012, 20:33

Wie jetzt? Das Textur Objekt befindet sich in der "Object" Klasse und das Objekt dieser Klasse befindet sich in der Liste.
Rendern tu ich dann so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
App.clear();

for(liste durch iterieren)
{
    i->draw(); // Ruft intern App.draw(sprite); auf
}

App.display();

Auf die Textur kann in der ganzen Klasse "Object" zugegriffen werden. Oder was meinst du, Nimelrian?

...

Das lustige ist ja auch, das ich auf das Textur Objekt ohne Probleme (über die Liste) zugreifen kann und es mir auch die
richtigen Eigenschaften zurück liefert (Größe der Textur, ...). Das einzige was halt nicht funktioniert, ist dass die Textur
im Fenster richtig dargestellt wird (also dass es nicht nur ein weißes Viereck ist).

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Jack« (01.10.2012, 20:39)


Geheim

Treue Seele

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

5

01.10.2012, 20:42

Du musst der Klasse die Textur als Referenz übergeben, also Object(sf::Texture &texture);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

01.10.2012, 21:05

Sollte eigentlich nicht notwendig sein. Zumindest im aktuellen Snapshot sieht es mir so aus, als ob der Copy Constructor von sf::Texture die Textur tatsächlich kopieren würde...

7

01.10.2012, 21:26

Zitat

Du musst der Klasse die Textur als Referenz übergeben, also Object(sf::Texture &texture);

Wenn ich es so mache:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class Object
{
    public:

    Object(sf::Texture &texture);

    private:

    sf::Texture *texture;
    sf::Sprite sprite;
};

Und dann in der Funktion "function()" dass mache:

C-/C++-Quelltext

1
2
3
4
5
6
7
sf::Texture texture;

texture.loadFromFile("...");

Object object(texture);

list.push_back(object);

Hab ich anschließend nichts auf dem Bildschirm, was ja auch logisch ist,
denn wegen dem Scoping zeigt der Zeiger später nicht mehr auf die richtige Adresse... :P

Oder verstehe ich dich falsch "Geheim"?

Zitat

Sollte eigentlich nicht notwendig sein. Zumindest im aktuellen Snapshot sieht es mir so aus, als ob der Copy Constructor von sf::Texture die Textur tatsächlich kopieren würde...

Das heißt? :P

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

01.10.2012, 21:33

Das heißt: Zeig mal mehr Code. ;)

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

9

01.10.2012, 21:36

Du solltest die Textur nicht auf diese Art speichern. Zum einen führt dies genau zu solchen Problemen, dass die Textur umher kopiert wird und es dann z.T. passieren kann, dass sie die Gütligkeit verliert oder dass OpenGL denkt, dass die Texture nicht mehr gebraucht wird und sie frei gibt, und zum anderen ist das Kopieren einer Textur eine sehr zeit intensive Operation, welche man am Besten umgeht.
Dies kann dann gemacht werden, in dem die Texturen extern von den zu zeichnenden Objekten verwaltet wird (z.B. Ressourcen Manager) und den Objekten dann nur eine Reference vergeben wird.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Geheim

Treue Seele

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

10

01.10.2012, 22:28

Die Instanz in der Klasse darf kein Zeiger sein, sondern eine ganz normale Textur (sf::Texture texture;)
Also:

C-/C++-Quelltext

1
2
3
4
5
6
   //...
public:
   Object(sf::Texture &texture);
private:
   sf::Texture texture;
   //...


und dann normal im Konstruktor übergeben...
Ich würde aber an deiner Stelle die Textur in der Klasse weglassen und stattdessen gleich dem sprite setzen:

C-/C++-Quelltext

1
2
3
4
Object::Object(sf::Texture &texture)
{
    sprite.setTexture(texture);
}

Werbeanzeige