SFML community forums

Help => Window => Topic started by: Assassinbeast on November 04, 2012, 12:03:43 pm

Title: How do you make the keyboard just click one time? (SFML 2.0)
Post by: Assassinbeast on November 04, 2012, 12:03:43 pm
Hello  ;D

I have a problem with the keyboard input thing... i just want it to click 1 single time instead of 2 or 3 times when i click a key.

Heres my code... just so you can see what i mean. Also... Does key A count as "left mouse click"?... it looks like it does. (u can copy and paste if you wanna test)

#include <SFML/Graphics.hpp>
#include <sstream>
#include <string>

sf::RenderWindow mywindow(sf::VideoMode(800,600,32),"dsda");
sf::Event ev;

int x = 0;

template <typename T>
std::string toString(T arg)
{
        std::stringstream ss;
        ss << arg;
        return ss.str();
}

int main()
{
        sf::Text mytext;
        mywindow.setVerticalSyncEnabled(true);

        while(mywindow.isOpen())
        {
                mytext.setString(toString(x));
                while(mywindow.pollEvent(ev))
                {
                        if(ev.key.code == sf::Keyboard::A)
                        {
                                x++;
                        }
                }
                mywindow.clear(sf::Color(0,200,0));
                mywindow.draw(mytext);
                mywindow.display();

        }
}
 
Title: Re: How do you make the keyboard just click one time? (SFML 2.0)
Post by: FRex on November 04, 2012, 02:05:52 pm
This is stressed so much in the tutorial that Laurent should have started French Baguette Massacre by this point :
Quote
The valid member is the one that matches the event type, for example event.key for a KeyPressed event. Trying to read any other member will result in an undefined behaviour (most likely: random or invalid values). So never try to use an event member that doesn't match its type.
(...)
Read the above paragraph once again and make sure that it's printed in your head, the sf::Event union causes too many problems to inadvertent programmers.
:-X
Title: Re: How do you make the keyboard just click one time? (SFML 2.0)
Post by: Assassinbeast on November 04, 2012, 03:10:08 pm
sorry, forgot there were tutorials  ::)
Title: Re: How do you make the keyboard just click one time? (SFML 2.0)
Post by: kaB00M on November 04, 2012, 11:23:40 pm
You can use something like:

bool key_triggered[sf::Keyboard::KeyCount]; //array containing all possible keys

void resetTriggered()
{
    for (int i = 0; i < sf::Keyboard::KeyCount; ++i)
        key_triggered[i] = false;
}

//initialize!
ResetTriggered();

bool isKeyTrigger(sf::Keyboard::Key key)
{
    if ( sf::Keyboard::isKeyPressed(key) && !key_triggered[key] )
    {
        return (key_triggered[sf::Keyboard::Right] = true);
    }
}
 

Now, you can use it like this.

if (isKeyTrigger(sf::Keyboard::Right)) //your choice of key
{
    //example: move character right!
}

//must update after end of key-check loop!
resetTriggered();
 

This is a simplified version; you can insert the variables and fuction inside a class to make it more uniform.
Also, note that you can check for the same key ONLY ONCE per frame/tick.