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

-=Andreas=-

unregistriert

1

20.04.2010, 06:55

Probleme mit der Zeit

Hallo Leute!

Ich habe folgendes Problem. Ich möchte das bei meinem SDL Spiel nach einer bestimmten Zeit der Zustand des Spiels verändert wird. Dazu habe ich mir überlegt das ich eine Variable anlege die angibt wie lange z.B. das erste Level dauern soll (z.B. m_fLevelTime = 100.0f). Jetzt will ich in der Hauptschleife des Spiels anhand dieser Zahl den Zustand des Spiels verändern indem ich einfach immer sage:

C-/C++-Quelltext

1
 if (m_fLevelTime > 0.0f) { m_fLevelTime -= g_pTimer->GetElapsed(); if(m_fLevelTime < 0.0f) { m_iGameState = 2; }}
. Meine Frage ist jetzt ob man das so machen kann oder ob nicht denn g_pTimer->GetElapsed(); ergibt sich aus folgendem:

C-/C++-Quelltext

1
2
3
m_fCurTime = SDL_GetTicks() / 1000.0f - m_fPauseTime;
m_fElapsed = m_fCurTime - m_fLastTime;
m_fLastTime = m_fCurTime;
Oder ist m_fElapsed von der Computerleistung abhängig :?:

2

20.04.2010, 10:29

Ich bin mir jetzt nicht sicher, wie's bei der SDL ist, aber zumindest in der SFML wird getElapsed für die Zeit verwendet, die seit dem letzten Frame vergangen ist. Wenn Du jetzt mehr Frames hast, dann ist diese Zeit zwar geringer, aber Du subtrahierst ja öfter, insofern dürfte diese Zeit immer gleich sein und das Spiel auf jedem Computer nach z.B. 100 Sekunden aufhören. Sicher bin ich mir allerdings nicht.

3

20.04.2010, 10:36

Ist doch okay so, ich hätte es nur so gelöst:

C-/C++-Quelltext

1
2
3
4
5
6
7
m_fLevelTime += g_pTimer->GetElapsed(); 

if (m_fLevelTime > 100.0f) 
{ 
    m_fLevelTime = 0; 
    m_iGameState = 2; 
}

Elapsed ist von der Framerate abhängig und damit kann man dafür sorgen, dass auf allen PC's alles gleich schnell abläuft. Es braucht auf allen PC's gleich lange bis es auf 100 ist.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

-=Andreas=-

unregistriert

4

20.04.2010, 15:32

Okay - Danke das mit den Level Veränderungen klappt jetzt. 8)

5

12.05.2010, 22:36

Hi, auch ich habe ein paar Fragen

Ich habe folgendes problem:

ich berechne in jedem frame meine neue position so:

position += speed * frameTime

und anschließend überprüfe ich ob objekte sich berühren dabei tritt folgendes problem auf

wenn speed sehr groß wird oder die frameTime sehr groß wird, so bewegt sich die figur bei einem einzigen frame durch ein anderes objekt durch und somit funktioniert die kollision nicht, was kann man da machen?
ist es vielleicht besser feste schrittweiten vorzugeben und diese funktion einfach je nach rechenpower öfter bzw seltener aufrufen?

vielen dank schonmal für eure hilfe

6

12.05.2010, 22:56

Speed sollte eher konstant bleiben. Wie verändert sich der Wert denn? Hast du mal frameTime überprüft? Wie hoch ist Speed normalerweise?
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

7

12.05.2010, 23:04

0.05 sec so, aber meine kollisionserkennung ist glaube ich ziemlich schlecht und da bei mir zur laufzeit noch objekte hinzukommen können kann das auch noch schlechter werden und genau dann "springen" mein objekte durch andere.

EDIT:

meine objekte sind relativ klein (20.0f breite , 20.0f höhe) und die geschwindigkeit ist so 200.0f bis 400.0f, je nachdem auf welchem schwierigkeitsgrad

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kalkas« (12.05.2010, 23:19)


8

13.05.2010, 06:13

Mh also ich habe die Geschwindigkeit beim Tutorial von mir auf 150.0f, hatte es Testweise aber auch schon auf 250.0f und selbst da hatte ich im Debug Modus keinerlei Probleme. Das Problem dürfte irgendwo anders liegen. Was für einen PC hast du? Es ist jetzt schwierig zu sagen wo der Fehler im Code sein könnte, aber irgendetwas muss dein Programm ja derart bremsen, dass sowas zustande kommen kann. Normalerweise ist es aber so, dass die Kollisionserkennung trotzdem funktioniert, habe es jedenfalls noch nie anders gesehen. Zeig doch einfach mal deine Kollisionsabfrage.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

ernest7

Frischling

Beiträge: 20

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

13.05.2010, 09:29

also für mich klingt das spontan nach dem klassischen Problem, dass Hindernisse "übersprungen" werden, wenn man bei zu hoher Geschwindigkeit nur den Zielpunkt auf Kollision prüft.
Lösung wäre entweder in einer Schleife alle Zwischenpositionen bis zum Zielpunkt ebenfalls zu prüfen, oder den Bewegungs-"Strahl" gegen die Hindernisse zu prüfen (Stichwort Ray-Sphere- / Ray-Triangle-Intersection).
*Werbung* Der Welt bestes Android-Metronom: Metronomerous *Werbung*

10

13.05.2010, 13:29

genau ich teste nur den zielpunkt (das wird wohl das problem sein)

ist diese Ray-Sphere- / Ray-Triangle-Intersection das was man am besten benutzten sollte bei 2D programmierung?

danke schonmal für die antworten =)

Werbeanzeige