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

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

1

10.03.2016, 13:59

C++ SFML bool Variable durch Tastatureingabe verändern

Hallo zusammen,
ich möchte in meinem Spiel ein Menü ein- und ausblenden, wenn eine Taste gedrückt wird. Dafür verwende ich eine bool Variable, die wenn sie auf true ist das Menü anzeigt und beim erneuten drücken der Taste das Menü wieder ausblendet.

Durch meinen jetzigen Code darf man die Taste nicht länger als 0,01 Sekunden gedrückt halten, da sonst die Variable 100 mal verändert wird.
Ich habe es bislang so "gelöst":

C-/C++-Quelltext

1
2
3
4
   if (sf::Keyboard::isKeyPressed (sf::Keyboard::H)){
        
        Hilfemenü = !Hilfemenü;
    }


Gibt es eine Möglichkeit die Eingabe nur einmal zu werten, um die Variable nicht dauerhaft zu ändern?

Vielen Dank

LG Tute
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

2

10.03.2016, 14:14

Dein Programm müsste also wissen, ob die Variable beim drücken verändert werden soll, nämlich genau dann, wenn vorher die taste losgelassen wurde oder bisher noch keine gedrückt wurde.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

3

10.03.2016, 14:14

Die SFML bietet hierfür die KeyPressed und KeyReleased Events an. Dmit ersparst du dir mühsames Implementieren

Documentation

Zitat

This event is the one to use if you want to trigger an action exactly once when a key is pressed or released, like making a character jump with space, or exiting something with escape.

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

4

10.03.2016, 14:50

Die SFML bietet hierfür die KeyPressed und KeyReleased Events an. Dmit ersparst du dir mühsames Implementieren


Laut Dokumentation müsste es so gehen, tut es aber nicht:(Es passiert gar nix)

C-/C++-Quelltext

1
2
3
4
5
6
    if ((event.type == sf::Event::KeyPressed) && (event.key.code == sf::Keyboard::H)){
        
        Hilfemenü = !Hilfemenü;
        std::cout << "HI";
    
    }
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

10.03.2016, 14:59

@Wirago:
Scheint so nicht ausreichend zu sein, da
If a key is held, multiple KeyPressed events will be generated, [...]
Er will aber nur die Zustandsänderung der Taste haben, nicht aber die Anschlagswiederholung.

@tutedutsch:
Wo kommt bei dir der Wert für event her? Ist das die Rückgabe von pollEvent? Wird pollEvent auch in einer Schleife aufgerufen?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

6

10.03.2016, 15:03

Wo kommt bei dir der Wert für event her? Ist das die Rückgabe von pollEvent? Wird pollEvent auch in einer Schleife aufgerufen?

Ich habe event über

C-/C++-Quelltext

1
sf::Event event;
eingebunden, fehlt da noch eine Zuordnung?
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

RmbRT

Treue Seele

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

7

10.03.2016, 16:59

Schau dir mal Event-Polling-Schleifen an. Ich weiß jetzt nicht auf die schnelle, wie man das in SFML macht, aber es müsste dazu einen Beispielcode in der SFML Doku geben.

Grüße
RmbRT
"Dumm ist, wer dummes tut."

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

10.03.2016, 17:01

Ob es da etwas fertiges gibt weiß ich nicht. Es lässt sich aber leicht implementieren. Du nutzt zwei Variablen:

C-/C++-Quelltext

1
2
bool wasPressed;
bool isPressed;

Am Anfang deines Loops setzt du die Werte passend:

C-/C++-Quelltext

1
2
wasPressed = isPressed;
isPressed = isKeyPressed();

Wobei isKeyPressed() eine Funktion wäre die true zurück gibt wenn die Taste grad gedrückt ist. Den Code kannst du dir ja deine Bedürfnisse anpassen. Deine Abfrage machst du dann mit:

C-/C++-Quelltext

1
2
3
if(!wasPressed && isPressed) {
    // Die Taste wurde erst jetzt gedrückt, im letzten Frame aber noch nicht
}

Willst du prüfen ob eine Taste genau jetzt losgelassen wird geht das genau anders herum:

C-/C++-Quelltext

1
2
3
if(wasPressed && !isPressed) {
    // Die Taste wurde erst jetzt losgelassen, im letzten Frame wurde sie aber noch gedrückt
}


Das wäre ein sehr simples Prinzip um dein Problem zu lösen. Benötigst du das für viele Tasten wäre es sinnvoller statt 2 Variablen pro Taste auf eine geeignete Datenstruktur zurückzugreifen die diese Zustände für alle Tasten bereitstellt. Wie gesagt es ist eine eher simple Lösung. Wenn SFML da was fertiges hat wäre das natürlich zu bevorzugen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

tutedutsch

Frischling

  • »tutedutsch« ist der Autor dieses Themas

Beiträge: 28

Beruf: IT Systemkaufmann in Ausbildung

  • Private Nachricht senden

9

10.03.2016, 20:14

@Schorsch vielen Dank, es funktioniert genau so, wie ich es wollte auch wenn mir das ein wenig "inoffiziell" aussieht(da gibt es bestimmt noch etwas simpleres, aber das kann man ja erstmal so lassen)

@RmbRT das schau ich mir später mal an, wenn ich mit der Materie etwas vertrauter bin

Danke euch beiden:)
YouTube:Comedykanal|TUTEDUTSCH
YouTube:Codingkanal|TuteCodes
Website:tutedutsch.jimdo.com

Werbeanzeige