2012-04-14 5 views
6

Estoy tratando de poner en práctica la introducción de texto de teclado para el chat en el juego, al escribir el nombre del personaje, guardar el nombre del archivo, etc.decisiones en XNA (para la introducción de nombres, el chat)

me estaba metiendo con KeyboardState tratando para obtener el símbolo añadido más nuevo para traducirlo en un carácter que podría agregar a mi cadena de entrada, pero parece ordenar la matriz de teclas presionadas actualmente en algún orden (apuesto a que está ordenado por código clave), por lo que no puedo encontrar fácilmente qué tecla se presionó al final para agregarla a la cadena de entrada.

¿Hay una manera fácil de detectar la última tecla de texto presionada (incluidas las situaciones en las que se presionan varias teclas, porque la gente lo hace a veces), o es más fácil utilizar algunas soluciones existentes?

Estoy estudiando C# y XNA, así que me gustaría poder hacerlo yo mismo, pero al final quiero que mi juego funcione.

Respuesta

6

Para manejar la entrada de texto, necesitará saber cuándo se presiona una tecla o liberado Desafortunadamente, KeyboardState de XNA realmente no ayuda con esto, por lo que tiene que hacerlo usted mismo. Básicamente, solo necesita comparar PressedKeys de la actualización actual con las PressedKeys de la actualización anterior.

public class KbHandler 
{ 
    private Keys[] lastPressedKeys; 

    public KbHandler() 
    { 
     lastPressedKeys = new Keys[0]; 
    } 

    public void Update() 
    { 
     KeyboardState kbState = Keyboard.GetState(); 
     Keys[] pressedKeys = kbState.GetPressedKeys(); 

     //check if any of the previous update's keys are no longer pressed 
     foreach (Keys key in lastPressedKeys) 
     { 
      if (!pressedKeys.Contains(key)) 
       OnKeyUp(key); 
     } 

     //check if the currently pressed keys were already pressed 
     foreach (Keys key in pressedKeys) 
     { 
      if (!lastPressedKeys.Contains(key)) 
       OnKeyDown(key); 
     } 

     //save the currently pressed keys so we can compare on the next update 
     lastPressedKeys = pressedKeys; 
    } 

    private void OnKeyDown(Keys key) 
    {   
     //do stuff 
    } 

    private void OnKeyUp(Keys key) 
    { 
     //do stuff 
    } 
} 

Dé su clase Juego un KbHandler, y llame a su método de actualización del método de actualización de su juego.

(BTW es probable que haya una manera más eficiente para comparar dos matrices que con foreach y contiene, pero con tan pocos elementos para comparar dudo que va a importar.)

+0

Gracias, este es el tipo de algo que estaba buscando. – user1306322

0

Usted podría intentar el ejemplo enumeran here

KeyboardState keybState = Keyboard.GetState(); 
if (keybState.IsKeyDown(Keys.Left)) { 
    // process left key 
} 
if (keybState.IsKeyDown(Keys.Right)) { 
    // process right key 
} 

Este se encargará de múltiples teclas pulsadas al mismo tiempo. Si desea evitar eso, agregue un else antes del segundo if (y siguientes)

Además, una tecla presionada activará varios eventos de tecla abajo; si esto no es deseable, deberá introducir un variable de estado que activa cuando la tecla está desactivada y cuando no lo está y proceda según su estado cuando la tecla es presionado

+0

Estoy intentando leer los caracteres de texto no es así, teclas de flecha. – user1306322

+0

Claramente, también puede leer los demás: [MSDN] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx), p. 'Keys.A' en lugar de' Keys.Left' – Attila

+0

. Sospecho que lo dijiste en serio, y no es muy bueno escribir un escenario explícito para cada caso posible, y hay muchos casos en ascii, y mucho menos en unicode. ¿Conoces otra manera? – user1306322

Cuestiones relacionadas