C++ SFML | Springen
-
Hallo allerseits,
ich habe momentan ein ziemlich großes Problem unzwar, möchte ich ein kleines Jump and Run basteln, es läuft auch alles gerade ziemlich gut, nur ich schaffe es einfach nicht einen ordentlichen Sprung zu implementieren, hier ein wenig code :while(window.isOpen())
{
// Sprung
if(Keyboard::isKeyPressed(Keyboard::Space))
{
Playersprite.move(0,-5);
}
}Im Prinzip währe dies noch kein richtiger Sprung, sondern nur ein einfaches nach oben verschieben des Sprites, nur das eigentliche Problem besteht darin, das auch wenn ich nur die Leertaste antippe, der Sprite nach oben katapultiert wird, da die Eingabe durch die while Schleife sehr oft erneuert wird. Nun zu meiner Frage : Wie schaffe ich es, dass wenn ich die Leertaste drücke, der Sprite nur einmal die 5px hochspringt, und dann z.B. eine 1/4 Sek. gewartet wird, bis man den nächsten Sprung machen kann.
Ich hoffe meine Frage ist verständlich. Sonst versuche ich es gerne nochmal zu erklären.
Mfg
-
Ich wäre alternativ auch sehr glücklich über einen kompletten Quellcode, wie ihr den Sprung in euer Game implementiert habt

-
Hallo,
sfml hat doch eine Time-Klasse die du nutzen kannst:
http://www.sfml-dev.org/tutorials/2.1/system-time.php
Mach doch grob sowas:
sf::Clock clock; sf::Time jumpTime = Time.Zero; sf::Time jumpDuration = sf::::seconds(0.1f); while (window.isOpen()) { sf::Time elapsed = clock.restart(); if(Keyboard::isKeyPressed(Keyboard::Space) { if(jumpTime == Time.Zero) { Playersprite.move(0,-5); } else { jumpTime += elapsed; if(jumpTime > jumpDuration) jumpTime = Time.Zero; } } }
-
Funktioniert irgentwie nicht so ganz, bekomme immer folgende fehlermeldungen :
(157): error C2228: Links von ".Zero" muss sich eine Klasse/Struktur/Union befinden.
(157): error C2275: 'sf::Time': Ungültige Verwendung dieses Typs als Ausdruck
(148): error C2228: Links von ".Zero" muss sich eine Klasse/Struktur/Union befinden.
(148): error C2275: 'sf::Time': Ungültige Verwendung dieses Typs als Ausdruck
(55): error C2275: 'sf::Time': Ungültige Verwendung dieses Typs als Ausdruckund noch die dazugehörigen Code Zeilen :
146-161
Time elapsed = clock.restart(); if(Keyboard::isKeyPressed(Keyboard::Space)) { if(jumpTime == Time.Zero) { Playersprite.move(0,-5); } else { jumpTime += elapsed; if(jumpTime > jumpDuration) { jumpTime = Time.Zero; } } }46-55
Clock clock; Time jumpTime = Time.Zero; Time jumpDuration = sf::seconds(0.1f); while(window.isOpen()) { Event event; while(window.pollEvent(event)) { if(event.type == Event::Closed) window.close(); }
-
Der Code soll nur das Prinzip aufzeigen. Du solltest ihn verstehen und nicht 1:1 kopieren. Wenn du dann noch die Dokumentation von
sf::Timeanschaust, findest du den Fehler bestimmt heraus.
-
Hey,
wie Nexus schon sagte, wirst du die fehlenden sf:: bzw using und das '::::' selber korrigieren können.
Mein 'grober' Code war allerdings wirklich etwas zu grob:
jumpTime wird beim Sprunganfang gar nicht hochgesetzt und läuft daher nie in den else-Teil.
Stattdessen wäre ein zusätzliches 'bool isJumping' vielleicht besser, welches beim KeyEvent ggf. gesetzt und ggf. das Sprite positioniert und nach Ablauf der Zeit wieder auf false gesetzt wird.
-
Habe jetzt etwas eigenes geschrieben was auch ganz gut funktioniert, jedoch muss ich dort
window.clear();einsetzen, was alle Sprites kurz löscht, nur ist es möglich nur einen einzelnen Sprite zu löschen ?
-
Nein, du musst alles löschen. Versuche gar nicht erst, auf dieser Ebene zu "optimieren", Echtzeitgrafik funktioniert nicht so.
Lies dazu mal das offizielle Tutorial, der rote Kasten sollte deine Frage beantworten.