SFML community forums

Help => Window => Topic started by: acrin1 on November 25, 2007, 04:09:59 pm

Title: Reading key presses into a String
Post by: acrin1 on November 25, 2007, 04:09:59 pm
Hi,

I'm wanting to read in single key presses, do some error / special key checking and add the valid key presses to a c++ string. The string would be a mixture of upper and lower case letters and other symbols. Is there a simple way to do this rather than me having to check explicitly for every unique key like so?

if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::L)) myString = myString+"L"

I've looked in the documentation but it wasn't obvious to me how to do this.

In SDL I've been able to do the following in the past:

if ( event.type == SDL_KEYDOWN )
{
 if (( event.key.keysym.unicode < 0x80 ) &&
( event.key.keysym.unicode > 0 )) // it's printable
{
 keyString = (char)event.key.keysym.unicode, 1;
   
I also noticed that only there only seem to be lower case letters defined currently. Does this mean I can't differentiate between upper and lower case input?

Thanks.
Title: Reading key presses into a String
Post by: Laurent on November 26, 2007, 02:50:54 am
You can use a code equivalent to the SDL one you're showing (which is the right way of doing it), with the TextEntered event.

Code: [Select]
if ( event.Type == sf::Event::TextEntered )
{
    if ( event.Text.Unicode < 0x80 ) // it's printable
    {
        keyString = (char)event.Text.Unicode;
    }
}
Title: Reading key presses into a String
Post by: acrin1 on November 26, 2007, 02:21:50 pm
Quote from: "Laurent"
You can use a code equivalent to the SDL one you're showing (which is the right way of doing it), with the TextEntered event.

Code: [Select]
if ( event.Type == sf::Event::TextEntered )
{
    if ( event.Text.Unicode < 0x80 ) // it's printable
    {
        keyString = (char)event.Text.Unicode;
    }
}


That's great - I'll give it a try.

Thanks.
Title: Reading key presses into a String
Post by: acrin1 on November 28, 2007, 02:03:36 pm
I've been trying to read a single key to add it to a string editing routine but don't seem to be able to get this to work. Am I taking the wrong approach to this? Should events only be checked as part of the main loop? (where this seems to work fine).

Thanks.

--

std::string readAlphaKey()
{  
      sf::Event keyEvent;
      std::string keyString;
      bool done = false;

      while (!done)
      {
         while (App.GetEvent(keyEvent))
         {
               if ((keyEvent.Type == sf::Event::KeyPressed) && (keyEvent.Key.Code == sf::Key::Return)) { keyString="RETURN"; done = true; }
            if ((keyEvent.Type == sf::Event::KeyPressed) && (keyEvent.Key.Code == sf::Key::Back)) { keyString="BACKSPACE"; done = true; }
         }
         
         if ( keyEvent.Type == sf::Event::TextEntered )
         {
            if (( keyEvent.Text.Unicode < 0x80 ) && (!done)) // it's printable
            {
               keyString = (char)keyEvent.Text.Unicode;
               done = true;   
            }
         }         
      }
      return(keyString);  
}
Title: Reading key presses into a String
Post by: Laurent on November 29, 2007, 03:08:12 am
Quote
Should events only be checked as part of the main loop?

No, but if you already have an event loop in your main loop, then the event queue will be empty when you run your second event loop in readAlphaKey.