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
Du musst:
1. verticalVelocity in JEDEM Frame um, sagen wir mal 50*Frametime erhöhen. Den Wert kannst du später, je nach gewünschter Fallgeschwindigkeit anpassen. Das sorgt dafür, dass der Spieler im Freien fall immer schneller fällt. Bzw. beim Sprung langsamer steigt und wieder runter fällt.
2. Beim Tastendruck Prüfen ob der Spieler auf dem Boden steht und wenn ja verticalVelocity auf einen Negativen Wert SETZEN!
3. Bei Kontakt mit dem Boden verticalVelocity auf 0 setzen und den Spieler auf die höhe des Bodens stellen. Weil er sich ständig nach unten bewegt und er nicht durch den Boden fliegen soll
4. verticalVelocity in jedem Frame verwenden. d.h. Position *= verticalVelocity*Frametime. Wenn der Spieler gerade nicht Springt oder Fällt ist der Wert sowieso auf 0 und bewirkt nichts
Community-Fossil
2. Die 2. und 3. verwirren mich ein wenig Ich soll bei 2 prüfen, ob der CHar am Boden ist. Also verticalVelocity = -200 zB wenn m_yPos == 415....Und bei 3 soll ich bei der sleben Bedingung verticalVelocity auf 0 setzen...
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 |
void Spieler::Update() { // Update- Bewegung des Spielers ProcessMoving(); // Position und Animation überprüfen CheckPosition(); // Wird jetzt in jedem Frame bearbeitet... verticalVelocity += 50 * g_pTimer->GetElapsed(); m_yPos += verticalVelocity * g_pTimer->GetElapsed(); } // Springen (in der ProcessMove()-Methde else if (g_pFramework->KeyDown(SDLK_SPACE)) { if (m_yPos >= 415.0f) { verticalVelocity = -200; } } // In der checkPosition()-Methode // Verhindert das Figur nach unten hin "durchfällt" if (m_yPos >= 415.0f) { m_yPos = 415.0f; } // Kontakt mit Boden? if (m_yPos == 415.0f) { // verticalVelocity = 0.0f; <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^ } |
C-/C++-Quelltext |
|
1 2 3 4 |
if (m_yPos >= 415.0f) { m_yPos = 415.0f; } |
C-/C++-Quelltext |
|
1 2 3 4 |
if (m_yPos <= 415.0f) { m_yPos = 415.0f; } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
// Kontakt mit Boden? if (m_yPos == 415.0f) { // verticalVelocity = 0.0f; <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^ } |
C-/C++-Quelltext
1 2 3 4 if (m_yPos >= 415.0f) { m_yPos = 415.0f; }
Müsste das nicht
C-/C++-Quelltext
1 2 3 4 if (m_yPos <= 415.0f) { m_yPos = 415.0f; }
sein? Ansonten wird die Figur ja immer auf den Boden zurück gesetzt, wenn sie in der Luft ist und der Code diese Stelle erreicht. Fällt sie unter den Boden, muss sie wieder auf 415 zurück gesetzt werden.
Ansonsten:
C-/C++-Quelltext
1 2 3 4 5 // Kontakt mit Boden? if (m_yPos == 415.0f) { // verticalVelocity = 0.0f; <--- Sobald ich diese Zeile hinzufüge funktioniert der SPrung nicht mehr...Wahrscheinlich weil vCity dann dauerhaft auf 0 ist oder?^^ }
Wenn Du die Leertaste drückst und die verticalVelocity geändert wird, musst Du aufpassen das der Spieler erst bewegt wird, bevor diese Codestelle erreicht wird. Ansonsten wird die verticalVelocity auf 0 zurück gesetzt, bevor der Sprung angefangen hat und es passiert nichts.
C-/C++-Quelltext |
|
1 2 3 |
m_yPos <= 415.0f; EDIT: Wenn ich das so mache kann ich aus der Luft herraus erneut springen und schwebe nach oben hin weg. geht also doch nciht^^ |
C-/C++-Quelltext |
|
1 |
verticalVelocity = 0.0f; |
Zitat
4. verticalVelocity in jedem Frame verwenden. d.h. Position *= verticalVelocity*Frametime. Wenn der Spieler gerade nicht Springt oder Fällt ist der Wert sowieso auf 0 und bewirkt nichts
C-/C++-Quelltext |
|
1 |
m_yPos [b]*[/b]= verticalVelocity*Frametime; |
Community-Fossil
C-/C++-Quelltext |
|
1 |
m_yPos == 415.0f |
C-/C++-Quelltext |
|
1 |
m_yPos <= 415.0f |
C-/C++-Quelltext |
|
1 2 3 4 5 |
if (m_yPos <= 415.0f) { m_yPos = 415.0f; verticalVelocity = 0.0f; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
if(g_pFramework->KeyDown(SDLK_RIGHT)) { //nach rechts bewegen } if(g_pFramework->KeyDown(SDLK_SPACE)) { //Sprung auslösen, wenn am Boden } |
Werbeanzeige