This project is read-only.

Arrancando motores

Para aquellos que quieren empezar y que no han visto nada de XNA seguro que con este tutorial pueden dar su primer paso.
Vamos a tener nuestro primer contacto con nuestro entorno de desarrollo, en donde vamos a ver cómo crear un proyecto de XNA y el entorno en el que nos vamos a mover.

Ejecutamos el Visual C# Express 2005 y nos vamos a "Archivo" -> "Nuevo Proyecto".

uno.jpg

dos.jpg

Elegimos en Tipo de proyecto el tipo "XNA Game Studio 2.0" y en las Plantillas elegimos "Windows Game (2.0)", damos un nombre al proyecto y pulsamos sobre Aceptar.

tres.jpg

En la parte derecha está el explorador de soluciones en el que vemos los directorios y clases de los que se compone nuestro proyecto.

Justo debajo tenemos el panel de propiedades, donde podemos modificar algunos parámetros de los elementos de nuestro proyecto. Y en la parte más amplia de la pantalla se encuentra la vista de código con la que daremos vida a nuestras creaciones.

Si ahora mismo pulsamos F5 aparece una ventana con fondo azul donde se producirá toda la acción de nuestros desarrollos. Esta ventana es creada gracias al código generado automáticamente cuando creamos el proyecto.

cuatro.jpg

Para poder ir viendo algo vamos a colocar una textura en esta ventana, para ello cerramos la ventana del juego y vamos al explorador de soluciones y en la carpeta Content pulsando con el botón derecho del ratón sobre ella agregamos una nueva carpeta a la que vamos a llamar "pictures".

cinco.jpg

Ahora agregamos a nuestro proyecto la textura que queremos mostrar, simplemente pulsando con el botón derecho del ratón y buscamos Agregar un Elemento existente donde buscaremos la imagen en nuestro ordenador.

seis.jpg

siete.jpg

Enseguida añadiremos el código necesario para cargar nuestra textura, sin embargo creo que más de uno se estará preguntando que hace el código que ha generado automáticamente nuestro entorno de desarrollo y que nos ha creado ya nuestra ventana.

Las primeras líneas de código que vemos están dedicadas a referenciar las librerías que necesitamos para comunicarnos con los diferentes dispositivos y es donde podríamos añadir otras que necesitásemos.

using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;


A continuación destacan dos objetos, el GraphicsDeviceManager y el SpriteBatch. El primero de ellos nos permite gestionar las operaciones con la tarjeta gráfica y el segundo objeto es el que nos ayuda a dibujar las diferentes texturas con unas propiedades determinadas, es decir, podemos dibujar diferentes grupos de texturas cada uno de ellos con un SpriteBatch diferente y cada uno con unas propiedades diferentes para pintar esas texturas.

namespace WindowsGame1
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;


Después vemos el constructor del programa el que inicializamos el GraphicsDeviceManager e indicamos el directorio donde encontrar contenidos como texturas, sonidos, modelos, etc.

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }


En este método es donde puedes colocar todo lo que necesites que se inicie cuando arranque el programa, como pueden ser contadores de vidas, marcadores, posiciones de objetos, etc.

        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            base.Initialize();
        }


A continuación vemos dos métodos que nos van a permitir cargar y descargar elementos gráficos de la memoria, además también podemos construir aquí el correspondiente manejador de texturas , indicándole con que dispositivo tiene que trabajar.

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content to load your game content here
        }

        
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }


En el método Update colocaremos la lógica del programa, que se ejecuta en cada instante de tiempo.

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

            // TODO: Add your update logic here

            base.Update(gameTime);
        }


Y por último podemos ver el lugar donde indicar que una textura o un modelo se dibuje.

        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }


Entonces cuando arranca el programa ¿que es lo que pasa? bueno pues que el código que comienza a ejecutarse es el contenido en la clase Program.cs donde se crea un objeto de tipo Game, para ello vamos al método public Game1() de la clase Game1 y crea los dos objetos GraphicsDeviceManager y SpriteBatch, ya estaría creado el juego, ahora volvemos a la clase Program y se ejecuta game.Run().

Tenemos arrancado el juego pero internamente tiene que iniciar todos sus objetos y contadores para que podamos empezar a jugar así que ejecuta el método Initialize() y desde dentro de este método cuando llega a la instrucción base.Initialize(); carga todos los objetos gráficos indicados en LoadGraphicsContent.
Lo único que le queda es ir a Update correr el código que tenga dentro e ir luego al método Draw y dibujar la pantalla y todos los objetos que allí estén indicados. Con todo dibujado vuelve el programa a comprobar y ejecutar una y otra vez mediante el método Update las instrucciones del juego.

Ahora que sabemos un poco como se mueve todo esto vamos a ver que tenemos que hacer para cargar nuestra textura.

Bien, lo primero que necesitaremos es un objeto Texture2D para cargar el dibujo que hemos añadido y otro objeto de tipo Rectangle con las mismas dimensiones que la textura para representarlo en la pantalla.

        Texture2D background_tex;
        Rectangle background_rec;


Luego lo que podemos hacer es establecer algunos parámetros de la ventana del juego. Como podeis ver la ventana es de 800 por 600 sin pantalla completa, no os olvideis de llamar al método ApplyChanges() para hacer efectivos los cambios.

        graphics.PreferredBackBufferWidth = 800;
        graphics.PreferredBackBufferHeight = 600;
        graphics.IsFullScreen = false;
        graphics.ApplyChanges();


A continuación en LoadContent() inicializamos el manejador de sprites y cargamos la textura. También asigno las dimensiones adecuadas al objeto rectángulo que se va a representar el sprite en la pantalla.

          spriteBatch = new SpriteBatch(GraphicsDevice);
          background_tex = Content.Load<Texture2D>(@"./pictures/Title");
          background_rec = new Rectangle(0, 0, background_tex.Width, background_tex.Height);


Por último en el método Draw() ordenamos al SpriteBatch cuando tiene que comenzar a dibujar, lo que va a dibujar y cuando terminar.

      spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
      spriteBatch.Draw(background_tex,background_rec,Color.White);
      spriteBatch.End();


Aquí tenéis todo el código tal cual quedaría terminado y el resultado final. Como se puede ver pintar en la pantalla es bien sencillo y prácticamente no tiene complicación.

ocho.jpg

using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;

namespace HolaMundo
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        Texture2D background_tex;
        Rectangle background_rec;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        


        protected override void Initialize()
        {
            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
            graphics.IsFullScreen = false;
            graphics.ApplyChanges();

            base.Initialize();
        }

        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            background_tex = Content.Load<Texture2D>(@"./pictures/Title");
            background_rec = new Rectangle(0, 0, background_tex.Width, background_tex.Height);
        }

        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

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

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
            spriteBatch.Draw(background_tex,background_rec,Color.White);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

Descarga proyecto

HolaMundo.zip


Saludetes

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

Last edited Mar 25, 2008 at 12:48 AM by csharp, version 10

Comments

No comments yet.