exemplos usando XNA

Framework básico do XNA

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;
 
namespace MyGame
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
 
            base.Initialize();
        }
 
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            // TODO: use this.Content to load your game content here
        }
 
        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
 
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        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);
        }
 
        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            // TODO: Add your drawing code here
 
            base.Draw(gameTime);
        }
    }
}

Classe Game : xxxx
método Initialize : xxx
método LoadContent : xxx
método Update : xxx
método Draw : xxx

Desenhando um quadrado com textura na tela

A classe SpriteBatch serve para fazer desenhos 2D na tela, sejam estes desenhos imagens ou fontes.
Para se instanciar um objeto da classe SpriteBatch deve-se passar um GraphicsDevice como argumento.
O desenho num SpriteBatch requer que seja chamado o método begin. O método begin pode aceitar vários argumentos, mas para o caso mais comum a chamda do método begin sem argumentos é o suficiente.
Para colocar uma imagem na tela é necessário adicioná-la antes aos conteúdos, clicando-se com o botão direito do mouse em content e escolhendo a opção add -> existing item

add_content.png

O próximo passo é selecionar uma imagem e clicar em OK

select_image.png

Para se certificar se tudo ocorreu bem é só verificar se a imagem selecionada aparaceu na parte do conteúdo.

content_added.png

Uma coisa digna de nota é que o nome do ativo (asset name) é o nome do arquivo tirando a extensão. Este nome a gente irá utilizar para carregar o conteúdo.

Para carregar uma imagem é necessário declarar um objeto Texture2D e carregar o conteúdo através do gerenciador de conteúdo (Content Manager). Se por um acaso o nome do objeto texture2D for textura, a seguinte linha carrega a textura

textura = Content.Load<Texture2D>( "ball" )

ball seria o nome do ativo (asset name). Esta linha geralmente se encontra no método LoadContent.
Já o desenho acontece no método draw. Mais precisamente depois de invocado o método begin e antes de invocado o método end, ambos do objeto SpriteBatch.
O método de desenho básico é o método draw do objeto SpriteBatch. A imagem para ser desenhada como parâmetro e um retângulo com as coordenadas (x,Y) da tela aonde a imagem vai ser desenhada e dar um comprimento e altura que não necessariamente correspondem a tais parâmetros da altura, sendo que o próprio XNA cuida de redimensionar a imagem como necessário. O último parâmetro é a cor. Para os devidos fins se o programador deseja preservar as cores originais da imagem deve colocar neste parâmetros Color.White.

O código para o desenho de uma bola poderia então ser o seguinte:

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 Tutorial
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D textura;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
 
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            textura = Content.Load<Texture2D>("ball");
        }
 
        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
 
        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape) )
                this.Exit();
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
 
            spriteBatch.Draw(textura, new Rectangle(100,100,textura.Width,
                textura.Height ), Color.White);
            spriteBatch.End();
 
            base.Draw(gameTime);
        }
    }
}

Que dá como resultado

tutorial_textura.png

Fazendo uma classe de animação 2D utilizando uma imagem com "miniaturas"

( fazer e explicar uma amostra)

Tocando uma música

O exemplo para tocar música é semelhante ao de textura. Ao invés de um objeto Texture2D mexe-se com um objeto do tipo Song, que permite a reprodução de MP3 e WAV.
Como música também é um conteudo deve-se adicioná-la da mesma forma que com o exemplo da textura.

add_content.png

Certifique-se que o Content Processor é do tipo SOng depois de importada a música. Também dê o nome que você queira como nome de recurso (asset name) da imagem que é utilziado como parâmetro do método load.

content_song_added.jpg

Em seguida chama-se o método estático play da classe MediaPlayer. Segue um exemplo de código.

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 Tutorial
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D textura;
        Song musica;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
 
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            textura = Content.Load<Texture2D>("ball");
            musica = Content.Load<Song>("Kalimba");
            MediaPlayer.Play(musica);
        }
 
        protected override void UnloadContent()
        {
        }
 
        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape) )
                this.Exit();
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
 
            spriteBatch.Draw(textura, new Rectangle(100,100,textura.Width,
                textura.Height ), Color.White);
            spriteBatch.End();
 
            base.Draw(gameTime);
        }
    }
}

Reproduzindo vídeo

O código para executar um vídeo é parecido tanto com o código de se colocar uma figura quanto com o código de se tocar um arquivo de áudio. Deve-se criar um objeto do tipo Video e carregá-lo, da mesma forma que a textura e a música:

add_content.pngcontent_video_added.jpg

O player de vídeo deve ser instanciado

player = new VideoPlayer();

e deve-se mandar o player reproduzir o vídeo

player.Play(video);

Este método toca a música do vídeo. Já a textura é extraída por meio de um método GetTexture da classe do player de vídeo. Quando a textura é extraída ela é exibida da mesma forma que com uma textura normal, através do método draw da classe SpriteBatch.

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 Tutorial
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D textura;
        Song musica;
        Video video;
        VideoPlayer player;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
 
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
 
            textura = Content.Load<Texture2D>("ball");
            musica = Content.Load<Song>("Kalimba");
            MediaPlayer.Play(musica);
            video = Content.Load<Video>("Wildlife");
 
            player = new VideoPlayer();
            player.Play(video);
 
        }
 
        protected override void UnloadContent()
        {
        }
 
        protected override void Update(GameTime gameTime)
        {
            if (Keyboard.GetState().IsKeyDown(Keys.Escape) )
                this.Exit();
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
 
            spriteBatch.Draw(textura, new Rectangle(0,0,textura.Width,
                textura.Height ), Color.White);
            spriteBatch.End();
 
            Texture2D frame = player.GetTexture();
 
            spriteBatch.Begin();
            spriteBatch.Draw(frame, new Rectangle(textura.Width, textura.Height, frame.Width,
                frame.Height), Color.White);
            spriteBatch.End();
 
            base.Draw(gameTime);
        }
    }
}
tutorial_video.jpg

I/O (Mouse e teclado)

( fazer e explicar uma amostra)

Criando a própria geometria

( fazer e explicar uma amostra)

Render Targets

( fazer e explicar uma amostra)

Carregando um modelo animado

( fazer e explicar uma amostra)

Arquivos de efeito

A colocação de objetos no mundo e a criação de efeitos gráficos são em sua maioria realizados pelas classes Effect. A classe BasicEffect implementa algumas funcionalidades como aplicação de textura, materiais e iluminação por pixel, entretanto, para funcionalidades mais avançadas o usuárqio deve criar seu próprio arquivo de efeito. Um arquivo de efeito nada mais é do que um arquivo que reúne código HLSL para algum propósito. O código de tal arquivo de efeito é acessível através da classe Effect comentada anteriormente. Entretanto, para se fazer um arquivo de efeito é necessário de um entendimento mínimo do que são denominados shaders. Para a finalidade de se dar os primeiros passos em HLSL e arquivos de efeito em XNA seguem alguns links (todos em inglês):

http://www.catalinzima.com/?p=9
http://www.riemers.net/eng/Tutorials/XNA/Csharp/series3.php
http://www.neatware.com/lbstudio/web/hlsl.html
http://digitseven.com/shadersintro.aspx

Integrando XNA com Winforms

Há dois exemplos no site Apphub que mostram a integração de XNA com Winforms:

http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1
http://create.msdn.com/en-US/education/catalog/sample/winforms_series_2

Além disso, há outros links como http://xnaviewer.codeplex.com/, mas eu não testei. Contudo, creio que o funcionamento deva ser funcionalmente idêntico

A respeito dos dois primeiros links dados, há esta página que comenta sobre estes dois primeiros links e sobre suas vantagens e desvantagens, dando um jeito diferente para se fazer a integração.

xna
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.