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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

41

15.10.2015, 12:04

Und der Debugger liefert keine Erkenntnisse?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

42

15.10.2015, 12:08

Immer noch kein SSCCE. Wie sieht denn spawnAsteroid inzwischen aus?
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

43

15.10.2015, 12:16

Wegen dem mehrfach durchlaufen der Asteroidenliste.

Jein, die render Methode gehört nicht damit rein sondern (wie du es aktuell wohl machst) beim render Aufruf.

Aber du kannst die while und for-Schleife zusammenfassen und die Kollisionsprüfung sollte nach dem Update der Asteroiden aufgerufen werden.
Im Anschluss können die "toten" Asteroiden aus der Liste entfernt werden.

Zu deinem aktuellen Problem, sehe gerade nicht woran es liegen könnte.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

44

15.10.2015, 12:17

Und der Debugger liefert keine Erkenntnisse?
Nur das, was ich am Anfang des Threads hatte (Anhang)

Immer noch kein SSCCE. Wie sieht denn spawnAsteroid inzwischen aus?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void PlayState::SpawnAsteroid()
{
    // Alle 800 Millisekunde einen neuen Asteroiden erzeugen
    if (clock.getElapsedTime().asSeconds() >= 0.8f)
    {
        // Spieler bekommt einne Punkt dazu
        m_iPoints++;

        // Neuer Asteroid
        Asteroid asteroid;

        asteroid.Init();

        mAsteroidList.push_back(asteroid);

        clock.restart().Zero;
    }

}


Init in Asteroid.cpp:

C-/C++-Quelltext

1
2
3
4
void Asteroid::Init()
{
    loadAsteroid();
}


Und loadSteroid in Asteroid.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Asteroid::loadAsteroid()
{
    if (!mTexture.loadFromFile("assets/textures/asteroid/Asteroid.png"))
        throw std::runtime_error("Konnte den Asteroiden nicht laden - Asteroid.cpp");

    mTexture.setSmooth(true);

    mSprite.setTexture(mTexture);
    mSprite.setOrigin(mTexture.getSize().x / 2, mTexture.getSize().y / 2);  // Mittelpunkt ist genau in der Mitte der Textur
    
    mSprite.setPosition(randXPos(), 1.f);

}


EDIT:
randXPos in Asteroid.cpp:

C-/C++-Quelltext

1
2
3
4
5
6
float Asteroid::randXPos()
{
    float xPos = std::rand() % 930 + 30;

    return xPos;
}
»cojo2015« hat folgendes Bild angehängt:
  • Unbenannt.PNG

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

45

15.10.2015, 12:28

Hab ich's mir doch gedacht.
Tutorials lesen hilft.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

46

15.10.2015, 12:37

Hab ich's mir doch gedacht.
Tutorials lesen hilft.

Geanu das habe ich ja such schon gelesen, werde aber dadurch auch nciht wirklich schlauer...

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

47

15.10.2015, 12:48

Dein Sprite in Asteroid hält nur einen Zeiger auf den Texture-Member. In dem Moment, in dem der CCtor deines Asteroiden aufgerufen wird (push_back), wird eine Kopie deines Sprites (inklusive des Zeigers auf die ursprüngliche Texture) und der Textur erstellt und deinem neuen Asteroiden zugewiesen. Das Problem ist, dass der Texture-Zeiger deines neuen Sprites immer noch auf die Adresse der alten Texture zeigt, wo jetzt aber nichts mehr liegt. Die neue, kopierte, Texture liegt ja woanders. Dementsprechend zeigt der Zeiger auf keine noch lebende Textur und du bekommst ein weißes Sprite.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

48

15.10.2015, 13:15

Dein Sprite in Asteroid hält nur einen Zeiger auf den Texture-Member. In dem Moment, in dem der CCtor deines Asteroiden aufgerufen wird (push_back), wird eine Kopie deines Sprites (inklusive des Zeigers auf die ursprüngliche Texture) und der Textur erstellt und deinem neuen Asteroiden zugewiesen. Das Problem ist, dass der Texture-Zeiger deines neuen Sprites immer noch auf die Adresse der alten Texture zeigt, wo jetzt aber nichts mehr liegt. Die neue, kopierte, Texture liegt ja woanders. Dementsprechend zeigt der Zeiger auf keine noch lebende Textur und du bekommst ein weißes Sprite.
Ah ok! Und was müsste ich dann ändern ;( ?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

49

15.10.2015, 13:18

Pack nicht in jeden Asteroiden die Textur, sondern maximal eine Referenz oder einen Pointer auf diese. Sorg dafür, dass Texturen auch nur einmalig geladen werden und nicht tausendfach, denn die müllen dann auch tausendfach Deinen Speicher voll. Übergib niemals eine sf::Texture by value. Am besten machst Du Dir eine neue Klasse, die von sf::Texture und sf::NonCopyable erbt und verwendest nur noch die. Damit bist Du vor solchen versehentlichen Kopien auf jeden Fall sicher, auch wenn Du mal schlampig programmierst.
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]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

50

15.10.2015, 13:26

Am besten machst Du Dir eine neue Klasse, die von sf::Texture und sf::NonCopyable erbt und verwendest nur noch die

Also sozusagen einen "Manager"?

Werbeanzeige