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

11

03.01.2010, 16:35

Danke euch jetzt funktionierts! :D
Aber wie kann ich jetzt von den 10 Instanzen nur 1
nach dem Schuss löschen?

Jetzt fliegen sie auch nach unten. :D
-> VSAsteroid.at(i).Move(0, 200 * ElapsedTime);

12

03.01.2010, 16:37

std::vector hat doch die Methode erase ;)

13

03.01.2010, 16:44

Fürs Durchiterieren bieten sich Iteratoren an. Erstens senkt man die Anforderungen an den konkreten Containertyp (hier operator[]), zweitens hat man gleich ein Argument für erase() zur Hand.

C-/C++-Quelltext

1
2
3
4
for (std::vector<Asteroid>::const_iterator i = Vector.begin(); i != Vector.end(); ++i) 
{ 
    Vector[i].Draw();
}

Vom Design her habe ich hier allerdings nicht gerade ein gutes Gefühl. :p
Ist das sf::RenderWindow global deklariert?

P.S.: sf::Randomizer initialisiert sich selbst.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

14

03.01.2010, 16:45

@E122: was sehr langsam ist. warum verwendest du nicht list?
anstatt den asterioden zu löschen könntest du ihn einfach sehr weit nach oben setzen(negative y koordinate) an einer zufälligen x koordinate.
dann sieht es so aus als würde er nach ein paar sekunden neu kommen obwohl er die ganze zeit da war.
so sparst du dir das löschen.
ich würde ihn aber nur zeichnen wenn seine y koordinate über -50 ist sonst kostet das ganze wieder unnötige resourcen.
"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?

15

03.01.2010, 16:46

Zitat von »"NachoMan"«

was sehr langsam ist. warum verwendest du nicht list?
Naja. Bei so wenigen Asteroiden dürfte das nichts ausmachen. Zumal es ja noch die Möglichkeit gäbe, ungeordnete Elemente in O(1) aus dem std::vector zu löschen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

16

03.01.2010, 16:50

es geht ja nicht wirklich um die performance sondern darum, dass er sich angewöhnt sich immer die schnellste möglichkeit auszudenken. wenn die spiele nachher komplexer werden muss er das nicht erst neu lernen.
"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?

17

03.01.2010, 17:00

Wie benutze ich den erase.. ich habs so gemacht das wenn die Hp
der Spieler unter 0 ist sie nichtmehr gezeichnet werden, das Problem
ist jetzt nur das wenn ich eine instant treffe alle Instanzen nicht
mehr gezeichnet werden.

...(SLaser, VSAsteroid.at(i), NULL)
{
Leben = -200;
}...

18

03.01.2010, 17:08

Zitat von »"Genro"«

Wie benutze ich den erase..
Schau dir vielleicht mal die Einführung in die STL an, dort werden solche grundlegende Dinge erklärt. Auf www.cplusplus.com findest du ausserdem eine Dokumentation zu den Klassen, Funktionen und Templates der Standardbibliothek.

Zitat von »"NachoMan"«

es geht ja nicht wirklich um die performance sondern darum, dass er sich angewöhnt sich immer die schnellste möglichkeit auszudenken. wenn die spiele nachher komplexer werden muss er das nicht erst neu lernen.
Das stimmt, aber du weisst ja nicht, was er sonst noch für Operationen auf den Container anwendet. Der STL-Container std::list hat zudem 8 Byte Overhead pro Element, und jedes Element muss einzeln allokiert und deallokiert werden. Da der Standard-Allokator für grössere Objekte optimiert ist, braucht der new-Operator relativ viel Zeit, ausserdem kommen nochmals einige Bytes an verstecktem Verwaltungsaufwand hinzu. Im Weiteren gibt es etliche andere Faktoren, wie Invalidierung von Zeigern, Random-Access, die eine Containerwahl beeinflussen können. Das sollte man alles auch bedenken, bevor man voreilige Schlüsse zieht.

Davon abgesehen wird Genro sowieso noch einiges zu lernen haben, wenn er sich grösseren Projekten zuwendet. Gerade im Bezug aufs Programmdesign und die Aufgabenverteilung von Klassen wäre sicher noch einiges zu machen, was momentan noch unwichtig zu sein scheint.

19

03.01.2010, 17:11

Zitat

was sehr langsam ist. warum verwendest du nicht list?

Hä, ich hab doch ihm ein Beispiel gemacht, und da er vector benutzt, würde ihm doch eine Lösung für List nichts helfen !

Zitat

dass er sich angewöhnt sich immer die schnellste möglichkeit auszudenken. wenn die spiele nachher komplexer werden muss er das nicht erst neu lernen.

Leutz, Leutz. Das war ein Beispiel für Genro. Ich hab jetzt nicht sonderlich geachtet, ob das Beipsiel perfomancetechnisch der Hit ist. Ein Beispiel ist schliesslich keine Performancekritische Operation in meinem Quellcode ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 13:02)


20

03.01.2010, 17:28

:shock: ich weiß nicht ob ich jetzt nur gegen eine Wand gelaufen
bin oder drogen genommen habe aber jetzt funktionierts:

VSAsteroid.erase (VSAsteroid.begin()+5);
Ja ich weiß das löscht immer das 6 Element in dem Vector
und wegen der for schleife enstehen wieder neue, aber irgendwie
sieht es für meinen Zweck gut genug aus. Bin zu Faul jetzt
für jedes Element die Collision zu prüfen.

Vielen Vielen Dank an euch alle. :D

Werbeanzeige