¿Le resultó útil esta página?
Sus comentarios sobre este contenido son muy importantes. Háganos saber su opinión.
¿Tiene comentarios adicionales?
Caracteres restantes: 1500
Exportar (0) Imprimir
Expandir todo

Detección de la presión de una tecla (Windows, Windows Phone, Xbox 360)

XNA Game Studio 4.0
Muestra cómo detectar si un usuario presionó o liberó una tecla del teclado.

Muestra completa

El código de este tema muestra la técnica para detectar la presión o liberación de una tecla del teclado. Puede descargar una muestra de código completa de este tema, incluidos el código fuente completo y todos los archivos auxiliares que requiere la muestra.

Mediante GetState, un juego puede determinar qué teclas se están manteniendo presionadas. Con frecuencia, un juego necesita detectar cuándo un usuario ha presionado o liberado una tecla. Por ejemplo, existe un título de acción que requiere que los usuarios presionen y liberen teclas en rápida sucesión. En el ejemplo, se usa un objeto KeyboardState en caché para determinar si se presionaron o liberaron teclas en un marco determinado.

En Windows Phone, existen varias cuestiones que hay que tener en cuenta a la hora de diseñar un juego para que tome entradas del teclado. Por ejemplo, muchos dispositivos Windows Phone no tienen un teclado de hardware. Para obtener más información, vea Trabajo con teclados de hardware (Windows Phone).

En función del diseño del juego, es posible que algunas veces se compruebe con más frecuencia si se ha presionado una tecla y otras veces no. En el caso de presiones de teclas muy rápidas, es posible que se presione más de una tecla en el mismo fotograma. En este caso, se devuelve la última tecla presionada. La mejor manera de tratar este caso es escribir código que compruebe las presiones de teclas con la mayor frecuencia posible.

Bb203902.note(es-ES,XNAGameStudio.40).gifSugerencia
Esta técnica se implementa en el juego FuelCell, un juego desarrollado mediante el seguimiento de una serie de artículos sobre el tema que tratan el desarrollo de juegos básicos en 3D. Para obtener más información, vea FuelCell: ¿Cuál es mi motivación?.

Detección de la presión o liberación de una tecla

Para detectar si se ha presionado o liberado una tecla

  1. Declare un objeto KeyboardState para almacenar el último estado de teclado conocido (en este ejemplo, el objeto oldState).

  2. Asigne a este objeto un valor de su constructor.

  3. Llame a GetState para recuperar el estado de teclado actual (en este ejemplo, el objeto newState).

  4. Compare los valores de su objeto newState con los valores del objeto oldState.

    Las teclas presionadas en el objeto newState que no se presionaron en el objeto oldState, se presionaron durante este marco. Por consiguiente, las teclas presionadas en el objeto oldState que no fueron presionadas en el objeto newState, se liberaron durante este marco.

  5. Actualice el objeto oldState al objeto newState antes de salir de Update.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace Keypress
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        KeyboardState oldState;
        Color backColor = Color.CornflowerBlue;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
        }

        protected override void Initialize()
        {
            base.Initialize();
            oldState = Keyboard.GetState();
        }

        protected override void LoadContent()
        {
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
                ButtonState.Pressed)
                this.Exit();

            UpdateInput();

            base.Update(gameTime);
        }

        private void UpdateInput()
        {
            KeyboardState newState = Keyboard.GetState();

            // Is the SPACE key down?
            if (newState.IsKeyDown(Keys.Space))
            {
                // If not down last update, key has just been pressed.
                if (!oldState.IsKeyDown(Keys.Space))
                {
                    backColor = 
                        new Color(backColor.R, backColor.G, (byte)~backColor.B);
                }
            }
            else if (oldState.IsKeyDown(Keys.Space))
            {
                // Key was down last update, but not down now, so
                // it has just been released.
            }

            // Update saved state.
            oldState = newState;
        }

        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(backColor);
            base.Draw(gameTime);
        }
    }
}

Adiciones de comunidad

AGREGAR
Mostrar:
© 2015 Microsoft