• Advertisement
Sign in to follow this  

There has to be a better way... (to get text)

This topic is 1772 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Is there a better way to do the following?

 

I tried importing Microsoft.VisualBasic and then using Interaction.InputBox() but it sometimes crashed and otherwise froze the game.

 

string text = string.Empty;

            if (IsNewKeyPress(Keys.A))
            {
                if (CurrentKeyboardState.IsKeyDown(Keys.LeftShift) || CurrentKeyboardState.IsKeyDown(Keys.RightShift))
                {
                    text += "A";
                }
                else
                {
                    text += "a";
                }
            }
            if (IsNewKeyPress(Keys.B))
            {
                if (CurrentKeyboardState.IsKeyDown(Keys.LeftShift) || CurrentKeyboardState.IsKeyDown(Keys.RightShift))
                {
                    text += "B";
                }
                else
                {
                    text += "b";
                }
            }
           //Through z, plus numbers

 

Share this post


Link to post
Share on other sites
Advertisement

depends on how IsNewKeyPress is implemented, can you capture key changes, or do you poll the entire keyboard?

 

in my keyboard implementation, i store an array of characters that recently changed, so i go over that list, and add the characters to my input field.

 

however, if you don't have any indication of what keys have changed, at best loop over the keys:

 

 

 //assuming ascii key chart, and first key is something like 32, and last key is something like 96 in ascii key chart.
 for(int i=FIRST_KEY;i<=LAST_KEY;i++){
  if(IsNewKeyPress(i)){
   if(LeftShift || RightShift) text+=upper(i); //upper returns an uppercase if possible, otherwise returns i. Also I stream-lined your left/right shift check.
   else text+=i;
 }
}
Edited by slicer4ever

Share this post


Link to post
Share on other sites

I am a little rusty on the VB so I will just pseudo code.

 

  Variable = Keypressed

   If ASC(Variable) => 32 and ASC(Variable) =<57 then string = string + Variable

 

  Be sure though to check for other keys as well, such as "ENTER" - "BACKSPACE" - "DELETE"

Share this post


Link to post
Share on other sites

Ya, I don't have any indication of what keys have changed, and IsNewKeyPress is implemented as checking the current and previous state to see if it was up and is now down. I don't think I can rely on the ascii table for all my keyboard buttons, but I guess I could replace the letters with a loop and then convert to upper case if shift is pressed. The other issue is that Keys is defined as an Enum of all the keyboard buttons.

 

I should also clarify that I am using c# and XNA. The keyboard state is coming from XNA.

Share this post


Link to post
Share on other sites

XNA generally does not have the best design to get keyboard input if you need to buffer a lot of key presses for typing longer strings. This article explains why. It gives you a better alternative that doesn't use long if statements, Dictionaries or Enum assignments.


The sample code is actually pretty simple. It basically looks for Windows message codes related to key presses.

Share this post


Link to post
Share on other sites

If you are going to use ASCII for letter checking, VB should catch that and automatically switch to upper case.

 

Write a simple test program to verify.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement