Taste Wiederholung in SFML 2.0
Gibt es eine Möglichkeit zu empfangen, wenn eine Taste wurde gerade gedrückt (nicht gehalten) in SFML oder Weise zu imitieren, um so einen Effekt?
Ich meine Umfrage-Ereignis hier,
while (window.pollEvent(event));
Und dann später in der Schleife, out of scope, aber mit den gleichen Fall, habe ich gelesen:
if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Up)
{
decision--;
if (decision < 0)
decision = CHARACTER_MAX - 1;
}
}
Diese macht decision
verringern kontinuierlich, wenn Sie die Pfeiltaste gedrückt gehalten wird. Mit sf::event
s, kann ich Lesen, wenn er das erste mal gedrückt wird und nicht, wenn er gedrückt wird?
Auch, wenn das nicht möglich ist oder Sie nicht vertraut sind mit der sfml, was wäre die beste Art und Weise zu imitieren, solche mit wenig oder gar keine globalisierte Variablen? (wie is_already_held
), z.B. https://gamedev.stackexchange.com/questions/30826/action-button-only-true-once-per-press
Ich erkennen, dass ein solcher kann nur die Weise (das deklarieren einer Variablen in einem größeren Umfang) aber ich würde lieber nicht, weil ich die Ausfahrt der Umfang kontinuierlich und versuchen Sie klare lenken von globalen Variablen so oft wie möglich.
while (window.pollEvent(event));
beachten Sie die;
: Sie bekam immer nur die Letzte Veranstaltung nach tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die deaktivieren-Taste Wiederholung mit
sf::Window::setKeyRepeatEnabled
:Nenne es einmal (das reicht) nach der Erstellung Ihrer Fenster.
Die Dokumentation ist hier.
Wenn aus irgendeinem Grund Sie nicht wollen, um diese Funktion zu verwenden, können Sie eine Tabelle der boolean zum speichern des Status der einzelnen Schlüssel. Hier ist ein pseudo-code, der zeigt, wie die Tabelle up-to-date und integriert Ihre "Entscheidung" - code.
Eine Dritte alternative ist die Verwendung einer Drittanbieter-Bibliothek wie Thor. Es ist noch in Entwicklung, so können Sie erwarten, dass einige änderungen gegenüber dem Autor. Und hier finden Sie ein tutorial auf Aktion – das ist genau das, was Sie brauchen.
Möchten Sie vielleicht die Verwendung
sf::Event::KeyReleased
anstelle dersf::Event::KeyPressed
Veranstaltung, die auch weiterhin ausführen, solange eine Taste "gehalten" werden, die Ihren computer löst deutlich schneller als die Dauer eines 'single' tap durch eine person.Wenn ich laufen:
Werde ich bekommen:
beliebige Anzahl von Zeiten (14, 23, 9, 31, usw.) basierend auf der Höhe der Zeit und mein finger drückte die return-Taste.
Wenn ich laufen:
Werde ich bekommen:
Nur einmal, basierend auf der single-Veröffentlichung von der return-Taste. 🙂
Es gibt definitiv Zeiten, wenn Sie wollen, zu einem
sf::Event::KeyPressed
Ereignis, wie halten Sie die "zoom" - Taste für eine Waffe mit einer Tragweite, die nur zoomt, während Sie die Taste gedrückt, oder halten "Ctl" für "Strg+alt+key" - Tastenkombinationen in einer Datei-editor, etc.setKeyRepeatEnabled()
oder irgendwelche 'Taste gedrückt' - Ereignis ist, dass es einfach nur unlogisch, um zu entscheiden, gedrückt, fast immer. Wenn Sie eine single Tippen, um ein Ereignis auszulösen vs. halten Sie die Taste gedrückt, würden Sie nicht den Schlüssel in der Hand hinunter in den ersten Platz. Diese Methode ist sauber und immer noch gibt Ihnen Zugriff auf die volle Nutzung der '- Taste gehalten " werden Ereignisse, wenn Sie würde nicht verwenden es in den MEISTEN Fällen, wenn Sie nicht einfach klopfen Schlüssel.Zu vermeiden, wiederholte abfeuern der Fall, wenn die-Taste gedrückt, können Sie
sf::Event::KeyReleased
stattsf::Event::KeyPressed
. Ich nehme an, das ist Ihr Ziel.Wenn nicht, müssen Sie zum speichern die Taste Status. Eine Klasse ist die logische Antwort, denn es verbindet Zustand mit Verhalten.