|
Table of Contents
|
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
O próximo passo é selecionar uma imagem e clicar em OK
Para se certificar se tudo ocorreu bem é só verificar se a imagem selecionada aparaceu na parte do conteúdo.
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
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.
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.
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:

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); } } }
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.





