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

30.08.2013, 23:39

Problem mit EnemySpawner (C++)

Hey,

ich habe ein kleines Problem mit meinem Spawner, er soll an einer zufälligen Position bis zu einer bestimmten Anzahl Gegner spawnen lassen. Das klappt auch alles soweit, nur habe ich jetzt das Problem das das Spiel nach ca. 10 Gegnern ziemlich langsam läuft(Der Spieler und die Bullets bewegen sich langsamer), was eigentlich nicht sein kann.
Hier ein Teil vom Code:

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
[cpp]
void Spawner::spawnEnemys(sf::RenderWindow *rw,EntityManager *em)
{
     enemyCount = em->mEntityList.size();
    if(enemyCount == maxEnemyCount){
       value = 0;
       maxEnemyCount = maxEnemyCount + 15;
     }
    if(enemyCount == 0)
       value = 1;

     spawnCount = spawnCount + value;
     int rnd1;
     int rnd2;

     if(spawnCount > maxSpawn)
     {
        rnd1 = (rand()&500)+1;
        rnd2 = (rand()&500)+1;

        Entity *e = new Entity("enemy.png",sf::Vector2f(rnd1,rnd2));

        std::string id = static_cast<std::ostringstream*>( &(std::ostringstream() << index) )->str();

        em->addEntity(id,e);

        std::cout << "Enemy Count: " << enemyCount << std::endl;
        index = index + 1;
        spawnCount = 0;
     }
}
[/cpp]

Die Sprites werden außerdem gelöscht und aus der Liste entfernt wenn sie mit einem Bullet kollidieren.

LG

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

31.08.2013, 04:52

Beschäftige dich bitte noch etwas mit den Grundlagen. In dem Code könnte ich fast jede Zeile durch etwas eleganteres ersetzen.
Dein Problem liegt wahrscheinlich woanders. Hast du den zurückzulegenden Weg (bzw. den Geschwindkeitsvektor) bei der Bewegung der Sprites mit der Zeit multipliziert?
Ich vermute nicht. Deshalb sinkt deine FPS wahrscheinlich von 1000 auf 200, weil du mehr Sprites zeichnest und verwaltest. Das heißt nicht unbedingt, dass dein Code ineffizient ist. Du brauchst bei dem Scenario immerhin nur das Fünffache der Zeit, obwohl du 10 mal so viel Zeichnest. Also komm garnicht auf die Idee deswegen etwas zu "optimieren".
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

3

31.08.2013, 12:47

Zitat

Dein Problem liegt wahrscheinlich woanders. Hast du den zurückzulegenden
Weg (bzw. den Geschwindkeitsvektor) bei der Bewegung der Sprites mit
der Zeit multipliziert?
Daran kann es nicht liegen, da die FPS auch weniger wird wenn ich die Sprites rendern lasse und nicht update.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

31.08.2013, 16:28

Klar werden die FPS weniger. Lass dir anstatt den FPS mal die frame time ausgeben, damit hast du einen vergleichbaren, linearen Wert. Solange dein Spiel die 60 FPS nicht unterschreitet oder 16.67ms nicht überschreitet sollte es keine Probleme geben.
Das Multiplizieren mit der Zeit gleicht das langsamer werden aus. Wenn ein Sprite beispielsweise 120x in der Sekunde um einen Pixel nach rechts bewegt wird, ist es nach einer Sekunde 120 Pixel weiter rechts. Wenn es allerdings mit 60 FPS läuft, dann wird das Sprite auch nur halb so schnell bewegt. Bei 60 FPS muss das Sprite sich um 2 Pixel weiterbewegen, damit die gewünschte Geschwindigkeit erreicht wird. Wenn die Geschwindigkeit mit der Zeit multipliziert wird, passt sich die Geschwindigkeit an und bleibt so überall gleich.

Werbeanzeige