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

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

1

16.12.2013, 19:17

[C++] [SFML] White-Square-Problem mit Listen

Schönen guten Abend,

Im Konstruktor der Game-Klasse werden 2 Player erstellt. Im Konstuktor der Player-Objekte wird jeweils ein Sprite- und einTexture-Objekt erstellt und miteinander verbunden. Die beiden Player werden in eine Liste geschoben.
Nun fliegen im laufenden Spiel nur 2 weiße Quadrate umher, die Textur ist irgendwie verloren gegangen.

Wenn ich die beiden Player als Membervariablen von CGame installiere, also Klassenglobal, dann klappt es. Ich will die Player aber erst zur Laufzeit erstellen, weil ich theoretisch unendlich viele Player erstellen will.

Wo liegt da das Problem?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
CGame::CGame()
: _timePerFrame(sf::seconds(1.f/60.f))
, _window(sf::VideoMode(1200, 750), "testgame", sf::Style::Close)
{
    CPlayer _player(_window);
    CPlayer _player2(_window);  
    _playerlist.push_back (_player);
    _playerlist.push_back (_player2);
}


Dank euch!

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

2

16.12.2013, 19:36

Mhm, wenn man die Texturzuweisung

C-/C++-Quelltext

1
  _shipSprite.setTexture(_shipTexture);


nicht im Konstruktor der Playerklasse vornimmt, sonder zB in der Render()-Funktion der Playerklasse, dann klappt es auch. Also die Textur geht nicht verloren, das Sprite verliert nur die Information darüber.
Bleibt nach wie vor die Frage, warum?

3

16.12.2013, 20:55

Kopierst du die Textur? Dann wird sie nämlich am Ende zerstört.
Ansonsten schiebt man sie oder eher deren verwendeten Verweise gern mal im Speicher hin und her (z.B. wenn man einen vector verwendet) was die Referenzen natürlich in diesem Sinne "ungültig" macht.
Außerdem solltest du, da du den Spieler ja in einen Container klatschst, den Kopierkonstruktor definieren und den Zuweiseungsoperator überladen, wo du die Textur dann eben setzt.

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

16.12.2013, 21:50

Jup, Texturen zu kopieren, weil sie by-value übergibt, verursacht genau solche Probleme. Möglichst - dringend - vermeiden. Am besten eine Unterklasse von sf::Texture erstellen, welche non-copyable ist. Ehrlich, das beseitigt viele Fehler und viele unnötige, ungewollt erstellte Kopien, so verrückt das auf den ersten Blick auf aussieht.
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]

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

5

17.12.2013, 00:42

Das klingt sinnvoll, werd ich so machen.
Allerdings dachte ich, das Problem besteht nur bei Pointern, weil wenn diese kopiert werden, sie immer noch auf die alte Adresse zeigen. Aber hier müsste _shipTexture doch komplett kopiert und zugewiesen werden.

ps: gibt es eigentlich eine möglichkeit, objekte direkt in einer Liste zu erstellen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

17.12.2013, 06:35

Die Textur wird kopiert. Aber das Sprite zeigt per Referenz auf ein nicht mehr existierendes Objekt.
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]

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

7

17.12.2013, 08:47

Es empfiehlt sich Texturen nicht direkt in einem Container zu speichern, sondern am Besten verwendest du std::unique_ptr<sf::Texture> oder falls die Texture geshared wird std::shared_ptr<sf::Texture>, auf diesem Weg kannst du die Smartpointers einfach verschieben/kopieren, ohne die Ressourcen lastigen Texturen zu kopieren.

ps: gibt es eigentlich eine möglichkeit, objekte direkt in einer Liste zu erstellen?
Die Frage ist eher, brauchst du eine Liste um Texturen zu verwalten? Würde ein Vector oder eine Map nicht viel besser passen? Listen braucht man eigentlich nur, wenn die Reihenfolge wichtig ist und man mitten drin viele Objekte löschen muss, beides sollte eigentlich nicht so wichtig sein für das verwalten von Texturen.
Für die Frage selbst, kannst du dir gerne Mal die C++ Referenz anschauen. ;)
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/

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

8

17.12.2013, 19:42

Für die Frage selbst, kannst du dir gerne Mal die C++ Referenz anschauen. ;)
Mhm, emplace_back scheint da genau das Richtige zu sein. Leider wirft der Compiler folgende Fehlermeldung aus(selbst mit dem code-bsp von cplusplus.com)

Quellcode

1
 »class std::list<std::pair<int, char> >« hat kein Element namens »emplace_back« mylist.emplace_back(30,'c');


neueste gcc-version ist installiert

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

17.12.2013, 20:09

Zitat

Es empfiehlt sich Texturen nicht direkt in einem Container zu speichern, sondern am Besten verwendest du std::unique_ptr<sf::Texture> oder falls die Texture geshared wird std::shared_ptr<sf::Texture>, auf diesem Weg kannst du die Smartpointers einfach verschieben/kopieren, ohne die Ressourcen lastigen Texturen zu kopier

Zum Einen sollte man ein solches Objekt am Besten gar nicht verschieben sondern wenn dann als Referenz nutzen und zum Anderen kann man so ein Objekt problemlos mit Move-Semantik verschieben. "unique_ptr" ist hier überflüssig.

Zitat

Leider wirft der Compiler folgende Fehlermeldung aus

Wie sieht den dein Code aus?
Du nutzt also den GCC?

Asbestbrezel

Frischling

  • »Asbestbrezel« ist der Autor dieses Themas

Beiträge: 41

Wohnort: Solingen

  • Private Nachricht senden

10

17.12.2013, 20:17

Mhm, ne, natürlich den g++.

Scheint so, als müsste man C++11 noch zusätzlich aktivieren, dann hagelts aber noch mehr Fehlermeldungen. Ich glaub ich lass das lieber erstmal...

Werbeanzeige