This project is read-only.

Tomando el control

En esta ocasión quería dar un vistazo rápido y sencillo a la programación de los controles en los juegos construidos con XNA.
Existen tres maneras diferentes de controlar el videojuego, puede ser por medio del teclado, del ratón o del mando de la XBOX 360.

La manera más común y que es con la que empezaron los primeros videojuegos es por medio del teclado, luego se incorporó el ratón para dar mayor jugabilidad y velocidad al jugador junto al teclado. Y desde hace unos años se pueden manejar por completo los videojuegos con el uso de un mando, opcional para los juegos que realices para PC pero obligatorio si estás programando para tu XBOX 360.

Básicamente para los tres dispositivos lo que se hace es crear una función en la que se comprueba el estado del dispositivo y luego según la tecla o botón pulsado se ejecuta la instrucción que nosotros indiquemos y esta función es llamada desde el método Update para que constantemente comprobemos que tecla o botón ha sido pulsado.

A continuación dejo el código de la función con el que se manejaría cada dispositivo, más abajo podeis ver los ejemplos para descargar y probar directamente.

Ejemplo para manejar el teclado:

/// Estos dos objetos están declarados de forma global

KeyboardState estadoTeclado;
Point _posicionbola = new Point(0, 0);
       

/// A esta función se le llama desde Update para que actualice el objeto 
/// _posicionbola 

        private void posicionTeclado()
        {
            estadoTeclado = Keyboard.GetState();
            Keys[] teclaspulsada = estadoTeclado.GetPressedKeys();

            foreach (Keys ekey in teclaspulsada)
            {
                if (ekey == Keys.Left)
                {
                    _posicionbola.X -= 10;
                }

                if (ekey == Keys.Right)
                {
                    _posicionbola.X += 10;
                }

                if (ekey == Keys.Up)
                {
                    _posicionbola.Y -= 10;
                }

                if (ekey == Keys.Down)
                {
                    _posicionbola.Y += 10;
                }
            }
        }

/// En Update se actualiza la posición y modifico el lugar donde mostrar la bola

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

            posicionTeclado();

            rectangulo_bola = new Rectangle(_posicionbola.X, _posicionbola.Y, textura_bola.Width, textura_bola.Height);
            base.Update(gameTime);
        }


Ejemplo para manejar el ratón:

/// Estos dos objetos están declarados de forma global

        MouseState estadoRaton;
        Point _posicionbola = new Point(0, 0);

/// A esta función se le llama desde Update para que actualice el objeto 
/// _posicionbola 

        private void posicionRaton()
        {
            estadoRaton = Mouse.GetState();

            if (estadoRaton.LeftButton == ButtonState.Pressed)
            {
                _posicionbola.X = 0;
                _posicionbola.Y = 0;
            }
            else 
            {
                _posicionbola.X = estadoRaton.X;
                _posicionbola.Y = estadoRaton.Y;
            }
        }

/// En Update se actualiza la posición y modifico el lugar donde mostrar la bola

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

            posicionRaton();

            rectangulo_bola = new Rectangle(_posicionbola.X, _posicionbola.Y, textura_bola.Width, textura_bola.Height);
            base.Update(gameTime);
        }


Ejemplo para manejar el mando de XBOX 360:

/// Estos dos objetos están declarados de forma global

        Point _posicionbola = new Point(0, 0);

/// A esta función se le llama desde Update para que actualice el objeto 
/// _posicionbola 

        private void posicionMando()
        {
           
            GamePadState estadoMando = GamePad.GetState(PlayerIndex.One);
            
            if (estadoMando.IsConnected)
            {

                if (estadoMando.DPad.Left == ButtonState.Pressed)
                {
                    _posicionbola.X -= 10;
                }

                if (estadoMando.DPad.Right == ButtonState.Pressed)
                {
                    _posicionbola.X += 10;
                }

                if (estadoMando.DPad.Up == ButtonState.Pressed)
                {
                    _posicionbola.Y -= 10;
                }

                if (estadoMando.DPad.Down == ButtonState.Pressed)
                {
                    _posicionbola.Y += 10;
                }

            }
        }

/// En Update se actualiza la posición y modifico el lugar donde mostrar la bola

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

            posicionMando ();

            rectangulo_bola = new Rectangle(_posicionbola.X, _posicionbola.Y, textura_bola.Width, textura_bola.Height);
            base.Update(gameTime);
        }


De todas formas todo esto se ve mejor ejecutando los ejemplos adjuntos.


Ejemplos: DemoTeclado.zip DemoRaton.zip DemoMando.zip


Saludetes

César Reneses Cárcamo
Coordinador Albacete DotNetClub
http://labloguera.net/blogs/csharp

Last edited Jan 9, 2010 at 9:15 PM by khronos, version 6

Comments

No comments yet.