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

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

12.05.2014, 00:02

SFML eine Input Klasse, nie etwas gedrückt

Heyho,

Ich bin grade dabei das erste Mal im aktuellen Projekt, die Inputklasse zu testen, die ich mir selber gebaut habe.
Als Grundstein liegt die SFML zugrunde. Ja, aktuell ist diese Klasse noch sinnlos, weil die SFML das gleiche schon macht, aber ich will sie später ausbauen.

Mein Problem ist aber, dass es vollkommen egal, ist was gedrückt wird, weil es so oder so als nicht gedrückt zählt ?(


Ich denke mal, das hier ist der relevante Code:

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
37
38
39
40
41
//////////////////////Der Code aus der MainLoop
Input.Update();

    if (Input.GetRawKeyboard().IsKeyPressed("UP"))
    {
        point_of_origin.y -= 50 * d_time;
    }
    if (Input.GetRawKeyboard().IsKeyPressed("DOWN"))
        point_of_origin.y += 50 * d_time;
    if (Input.GetRawKeyboard().IsKeyPressed("LEFT"))
        point_of_origin.x -= 50 * d_time;
    if (Input.GetRawKeyboard().IsKeyPressed("RIGHT"))
        point_of_origin.x += 50 * d_time;

//////////Die isKeyPressed Methode, die in der MainLoop aufgerufen wird
const bool KeyboardInput::IsKeyPressed(const std::string name) const
{
    for (auto key : Keytable.GetTable())
    {
        if (key.GetName() == name)
            return key.IsPressed();
    }
}

//////////////Die IsPressed Methode, die eben aufgerufen wurde
    bool IsPressed() const
    {
        return PressedThisFrame;
    }

///////// Update des Keys(wird bei Input.Update() ausgeführt):
bool KeyboardKey::Update()
{
    PressedLastFrame = PressedThisFrame;
    if (sf::Keyboard::isKeyPressed(Sf_Key))
        PressedThisFrame = true;
    else
        PressedThisFrame = false;

    return true;
}




Folgendes passiert bei meinen Tests:
- In der Update wird der Wert von "PressedThisFrame" beim drücken des Keys auf true gesetzt.
- Direkt danach ist es schon nicht mehr auf true

Ich habe bereits gedacht, dass die Keys wieder zerstört werden, aber dem scheint nicht so.

Kann mir irgendwer sagen, wieso die bools immer wieder auf false gesetzt werden? Benötigt ihr mehr Code?

Schon mal vielen Dank im voraus :)

EDIT: Hier einfach schonmal mehr Code, bin ja großzügig :D

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
37
38
39
40
41
42
43
44
45
46
47
/////////////////////////////////////////////////////Das Hier alles ist dann der "Key"
class InputKey
{
public:
    InputKey(std::string name)  //Standardconstructor
        : Name{ name }, PressedLastFrame{ false }, PressedThisFrame{ false }
    {}
    //virtual ~InputKey();

    //Memberfunctions
    bool JustGotPressed() const
    {
        return (PressedThisFrame && !PressedLastFrame);
    }
    bool IsPressed() const
    {
        return PressedThisFrame;
    }
    bool WasReleased() const
    {
        return (PressedLastFrame && !PressedThisFrame);
    }
    const std::string GetName() const
    {
        return Name;
    }
    virtual void Update() = 0;
protected:
    bool PressedThisFrame;
    bool PressedLastFrame;
    std::string Name;
};

//KEYBOARD
class KeyboardKey : public InputKey
{
public:
    KeyboardKey(std::string name, sf::Keyboard::Key key)
    : InputKey( name ), Sf_Key{ key }
    {};
    //virtual ~KeyboardKey();

    virtual void Update() override;
    bool operator == (const KeyboardKey key) const;
private:
    sf::Keyboard::Key Sf_Key;
};


Ich hoffe, dass der zusätzliche Code hilft, bei dem Rest könnte ich mir den Fehler absolut nicht vorstellen

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (12.05.2014, 00:14)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

12.05.2014, 06:40

Ich würde mal sagen der wichtigste Teil fehlt. Nämlich der, wo ein eine konkrete Instanz von KeyboardKey definiert und gesetzt wird.
Deinen "KeyTable" finde ich sehr unelegant. Dafür ist eigentlich std::map da. Genauso die Strings als KeyNames. Ein Enum wäre da irgendwie hübscher als eine wilde Sammlung von Strings, die bestimmt nirgends dokumentiert ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

12.05.2014, 11:03

Ja, leider ist da alles noch sehr durcheinander. Zur Zeit ist das System echt sinnlos :D. Aber wenn es fertig ist, soll daraus eine gute Input Klasse entstanden sein, mit der man den Input bearbeiten kann usw usw

Ich glaube ich stampfe das erstmal teilweise ein und werde es anders konzeptionieren und programmieren.



Naja, Keyboardkey ist einfach in einem Vector.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

4

12.05.2014, 11:35

Meiner Meinung nach ist dies schon sehr unnütz. SFML bietet eigentlich schon das nötigste. Falls du mehr brauchst, empfehle ich Thor's Actions.
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

5

12.05.2014, 16:33

So Fehler gefunden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
//////////Die isKeyPressed Methode, die in der MainLoop aufgerufen wird
const bool KeyboardInput::IsKeyPressed(const std::string name) const
{
    for (auto &key : Keytable.GetTable())/////// Hier das '&'
    {
        if (key.GetName() == name)
            return key.IsPressed();
    }
}


Wusste gar nicht, dass die neue for-Schleife sonst ein neues Objekt erzeugt :dash:

Trotzdem vielen Dank euch beiden :thumbup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (12.05.2014, 16:46)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

12.05.2014, 16:49

Es erzeugt eine Kopie, wenn im Vektor nur Value-Instanzen enthalten sind. Einer der Gründe, warum vollständiger Code mir allen Definitionen sinnvoll ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige