SFML Dynamische Tastenbelegungen



  • Hallo,

    ich programmiere momentan ein kleines Snake-Spiel, um damit c++ zu lernen. Dafür benutze ich SFML. Das Spiel ansich ist halbwegs fertig, jedoch möchte ich, dass der Nutzer beliebige Tasten für die Bewegung seiner Schlange festlegen kann.

    Meine Idee war es, die Tasten in einer .ini zu speichern und auszulesen, weil das relativ simple ist.

    Ich weiß allerdings überhaupt nicht, wie ich die richtigen Tasten dann zuordne.
    Die Bewegung wollte ich ungefähr so implementieren:

    if (sf::Keyboard::isKeyPressed(keyUp)) if (map.players[0].getDirection() != Snake::direction::DOWN) map.players[0].setDirection(Snake::direction::UP);
    if (sf::Keyboard::isKeyPressed(keyLeft)) if (map.players[0].getDirection() != Snake::direction::RIGHT) map.players[0].setDirection(Snake::direction::LEFT);
    if (sf::Keyboard::isKeyPressed(keyDown)) if (map.players[0].getDirection() != Snake::direction::UP) map.players[0].setDirection(Snake::direction::DOWN);
    if (sf::Keyboard::isKeyPressed(keyRight)) if (map.players[0].getDirection() != Snake::direction::LEFT) map.players[0].setDirection(Snake::direction::RIGHT);
    

    Dabei ist in den Variablen keyUp, keyLeft, keyDown und keyRight jeweils die zugewiesene Taste gespeichert.

    Ich kann aus meiner config.ini einen String oder Integer auslesen, aber wie kann ich daraus dann die Taste erkennen und in die jeweilige Variable speichern?

    Stehe da momentan etwas auf dem Schlauch 😕 Es wäre super nett, wenn ihr mir helfen könntet 🙂

    Gruß,
    Smofe



  • Smofe schrieb:

    Hallo,
    Ich kann aus meiner config.ini einen String oder Integer auslesen, aber wie kann ich daraus dann die Taste erkennen und in die jeweilige Variable speichern?

    Die Tastenwahl sind in SFML auch nicht mehr als ein Integer.

    enum  	Key {
      Unknown = -1,
      A = 0,
      B,
      C,
      D,
      E,
      F,
      G,
      H, 
    ...
    

    http://www.sfml-dev.org/documentation/2.0/classsf_1_1Keyboard.php

    #include <SFML/Graphics.hpp>
    #include <fstream>
    
    int main ()
    {
        sf::Keyboard::Key k = sf::Keyboard::A;
        //sf::Keyboard::Key k = 0;
    
        std::ofstream file("key.txt");
        file << k; //In der Datei steht jetzt 0
    }
    


  • ich kann dir kein fertiges Programm schreiben, aber ich hab dir ein paar Links, mit deren Hilfe du es selber hinbekommen solltest:
    https://github.com/LaurentGomila/SFML-Game-Development-Book/tree/master/04_Input (insbesondere die Klasse `Player`)
    https://github.com/LaurentGomila/SFML/wiki/Tutorial:-Manage-dynamic-key-binding



  • b.o.b schrieb:

    Smofe schrieb:

    Hallo,
    Ich kann aus meiner config.ini einen String oder Integer auslesen, aber wie kann ich daraus dann die Taste erkennen und in die jeweilige Variable speichern?

    Die Tastenwahl sind in SFML auch nicht mehr als ein Integer.

    enum  	Key {
      Unknown = -1,
      A = 0,
      B,
      C,
      D,
      E,
      F,
      G,
      H, 
    ...
    

    http://www.sfml-dev.org/documentation/2.0/classsf_1_1Keyboard.php

    #include <SFML/Graphics.hpp>
    #include <fstream>
    
    int main ()
    {
        sf::Keyboard::Key k = sf::Keyboard::A;
        //sf::Keyboard::Key k = 0;
    
        std::ofstream file("key.txt");
        file << k; //In der Datei steht jetzt 0
    }
    

    Stimmt, damit müsste das gehen.

    Aber wie bekomme ich es hin, dass der String "A" mit dem Integer 0 verbunden wird? In den Optionen des Programms soll dem Nutzer als ausgewählte Taste ja nicht 0, sondern A angezeigt werden.

    Ich will ja nicht umbedingt eine switch abfrage machen, die jedem Buchstabe manuell eine Zahl zuweist 😕



  • Smofe schrieb:

    Aber wie bekomme ich es hin, dass der String "A" mit dem Integer 0 verbunden wird? In den Optionen des Programms soll dem Nutzer als ausgewählte Taste ja nicht 0, sondern A angezeigt werden.

    const char* get_keyname(sf::Keyboard::Key k){
      static const char* const keynames[] ={
      "A",
      "B",
      "C",
      "D",
      "E",
      "F",
      "G",
      "H",
      "I",
      "J",
      "K",
      "L",
      "M",
      "N",
      "O",
      "P",
      "Q",
      "R",
      "S",
      "T",
      "U",
      "V",
      "W",
      "X",
      "Y",
      "Z",
      "Num0",
      "Num1",
      "Num2",
      "Num3",
      "Num4",
      "Num5",
      "Num6",
      "Num7",
      "Num8",
      "Num9",
      "Escape",
      "LControl",
      "LShift",
      "LAlt",
      "LSystem",
      "RControl",
      "RShift",
      "RAlt",
      "RSystem",
      "Menu",
      "LBracket",
      "RBracket",
      "SemiColon",
      "Comma",
      "Period",
      "Quote",
      "Slash",
      "BackSlash",
      "Tilde",
      "Equal",
      "Dash",
      "Space",
      "Return",
      "BackSpace",
      "Tab",
      "PageUp",
      "PageDown",
      "End",
      "Home",
      "Insert",
      "Delete",
      "Add",
      "Subtract",
      "Multiply",
      "Divide",
      "Left",
      "Right",
      "Up",
      "Down",
      "Numpad0",
      "Numpad1",
      "Numpad2",
      "Numpad3",
      "Numpad4",
      "Numpad5",
      "Numpad6",
      "Numpad7",
      "Numpad8",
      "Numpad9",
      "F1",
      "F2",
      "F3",
      "F4",
      "F5",
      "F6",
      "F7",
      "F8",
      "F9",
      "F10",
      "F11",
      "F12",
      "F13",
      "F14",
      "F15",
      "Pause",
      };
      return keynames[k];
    }
    

    :p



  • Super, danke! 🙂

    Ich hatte gehofft, dass es bereits irgend eine Art fertige Funktion dafür gibt. Funktioniert jetzt jedenfalls alles, vielen dank euch 🙂


Anmelden zum Antworten