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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

21

14.10.2015, 19:56

EDIT: Doch, sie werden entfernt, wenn sie außerhalb vom Bildschirm sind, aber wenn es eine Kollision zwischen dem Spieler gab, werden sie nicht aus der Liste entfernt. Und wenn ich in das Hauptmenü wechsel, dann kommt eine neue Fehlermeldung (siehe Anhang)
»cojo2015« hat folgendes Bild angehängt:
  • Unbenannt.PNG

ByteJunkie

Alter Hase

Beiträge: 891

Wohnort: Deutschland

Beruf: Softwareentwickler

  • Private Nachricht senden

22

14.10.2015, 19:56

Wo wird der Asteroid denn jetzt erzeugt? :rolleyes:
Mach was Du nicht lassen kannst und lass was Du nicht machen kannst. ;)

23

14.10.2015, 20:14

aber wenn es eine Kollision zwischen dem Spieler gab, werden sie nicht aus der Liste entfernt.


Du hast dir zwar für die Kollision ein Funktion geschrieben, nutzt sie aber nicht!
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

24

14.10.2015, 20:23

aber wenn es eine Kollision zwischen dem Spieler gab, werden sie nicht aus der Liste entfernt.


Du hast dir zwar für die Kollision ein Funktion geschrieben, nutzt sie aber nicht!

Doch: (PlayState.cpp)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void PlayState::ProcessEvents(Game &game)
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
    {
        mAsteroidList.clear();

        game.changeState(Game::gameState::MAINMENU);
    }

    // Gab es eine Kollision zwischen dem Asteroiden und dem Spieler?
    for (auto it : mAsteroidList)
    {
        it.CheckCollision(mPlayer->getSprite());
    }

    mPlayer->ProcessEvents();

}

25

14.10.2015, 20:33

In deinem ersten Beitrag ist davon nichts zu sehen.

Was hat das mit ProcessEvents zu tun, für mich ist das eine Methode die in Update gehört.
Ausserdem sieht es so aus, dass du die Liste der Asterioden 3x durchläufst, das könntest du auf einen durchlauf reduzieren.

Weiterhin würde ich das Sprite der Funktion CheckCollision als Referenz oder Pointer übergen, wenn es denn ein Sprite sein muss weil ein Rect würde hier ja vollkommen ausreichen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

26

14.10.2015, 20:38

Du liest aus Speicher, den du vorher freigegeben hast: http://stackoverflow.com/questions/37019…w/370362#370362
Btw: Du kopierst die Objekte immernoch in der Schleife dauernd nach i.
Schmeiß windows.h aus dem header raus, das ding treibt die compilierzeit in die Höhe. Includiere solche großen header nur dort wo du sie brauchst.
Den Zufallsgenerator solltest du nur einmal am Programmanfamg initialisieren.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

27

15.10.2015, 07:56

In deinem ersten Beitrag ist davon nichts zu sehen.
Oh tut mir leid, habe ich wohl vergessen zu kopieren :dash:

Ausserdem sieht es so aus, dass du die Liste der Asterioden 3x durchläufst, das könntest du auf einen durchlauf reduzieren.
Meinst du das so:

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
{
#pragma region texte

    txtLive.setString("Leben: " + std::to_string(m_iLive));
    txtPoints.setString("Punkte: " + std::to_string(m_iPoints));

#pragma endregion texte

    mPlayer->Update();

    // Jeden Asteroiden durchgehen und updaten, Kollisionen prüfen und Rendern
    for (auto &it : mAsteroidList)
    {
        it.CheckCollision(mPlayer->getSprite());
        it.Update();
        it.Render(game.App);
    }

    // Wenn der Asteroid nicht am Leben ist, dann von der Liste entfernen
    it = mAsteroidList.begin();
    while (it != mAsteroidList.end())
    {
        bool isAlive = it->getAlive();
        if (!isAlive)
        {
            it = mAsteroidList.erase(it++);
        }
        else
            ++it;
    }

    // Neue Asteroiden erstellen
    SpawnAsteroid();

    std::cout << mAsteroidList.size() << std::endl;

}

Weiterhin würde ich das Sprite der Funktion CheckCollision als Referenz oder Pointer übergen, wenn es denn ein Sprite sein muss weil ein Rect würde hier ja vollkommen ausreichen.
Ist das richtig?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void Asteroid::CheckCollision(sf::Sprite &sprite)
{
    // Überschneiden sich der Asteroid mit dem angegbenen Sprite?
    if (sprite.getGlobalBounds().intersects(mSprite.getGlobalBounds()))
    {
        // Kollision!
        m_bAlive = false;
    }

}


Schmeiß windows.h aus dem header raus, das ding treibt die compilierzeit in die Höhe. Includiere solche großen header nur dort wo du sie brauchst.
Den Zufallsgenerator solltest du nur einmal am Programmanfamg initialisieren.
Die windows.h brauche ich aber, um eine Zufallszahl zu generieren. Ich habe das include und das sarnd(timeGetTime()); in den Game-Konstruktor geschreiben, oder soll ich es in die Main.cpp schreiben?

28

15.10.2015, 08:11

Du brauchst aber nichts von windows.h im header sonderm nur in der cpp.
Ich würde den Zufallsgenerator in main.cpp tun.

29

15.10.2015, 08:38

Warum nutzt du nicht std::random?

Den Zufallsgenerator würde ich nicht in die main packen. Damit möchtest du praktisch nur einen Generator nutzen, was nicht immer gewollt ist. Außerdem gehört der Generator zu Game, warum also auslagern?

30

15.10.2015, 08:49

Im Falle des globalen Generators, welcher eben global genutzt wird, würde ich den schon in main initialisieren. Ansonsten, wenn du <ramdom> benutzt, hat natürlich jede Game-Instanz eine eigene Instanz eines Zufallsgenerators.

Werbeanzeige