Aula 3 – Arquitetura XNA e desenho 2D

download Aula 3 –  Arquitetura  XNA e  desenho  2D

If you can't read please download the document

description

Aula 3 – Arquitetura XNA e desenho 2D. O objetivo desta aula é apresentar aos alunos os elementos que compõe a arquitetura do XNA, e mostrar as facilidades para realizar desenhos 2D na tela Há diversos exemplos práticos para esta aula, cada exemplo é marcado por um slide escrito “demo” - PowerPoint PPT Presentation

Transcript of Aula 3 – Arquitetura XNA e desenho 2D

XNA Game Studio Express Deep Dive

Aula 3 Arquitetura XNA e desenho 2DO objetivo desta aula apresentar aos alunos os elementos que compe a arquitetura do XNA, e mostrar as facilidades para realizar desenhos 2D na telaH diversos exemplos prticos para esta aula, cada exemplo marcado por um slide escrito demoAo fim da aula reservado um tempo para os alunos exercitarem os conceitos apresentados, assim, no recomendvel que os alunos realizem os demos juntos com o professor, pois isso acaba tomando muito tempo da aula

nXNA Game Studio Aula 3

Arquitetura XNA e desenho 2D

Esteban Walter Gonzalez CluaInstituto de ComputaoUniversidade Federal Fluminense

n5/26/2009 2:05 PM2Agenda: Aula 3RevisoArquitetura de um programa XNADesenho em 2DComponents de um gameDiviso dos grupos para o projeto da matria n5/26/2009 2:05 PM3Reviso: Componentes do XNA Game Studio Framework

n5/26/2009 2:05 PM4Reviso: XNA FrameworkFramework(extenses)Modelo de AplicaoPipeline de Contedo(content pipeline)Framework(ncleo)GraphicsAudioInputMathStorageNetworkPlataformaDirect3DXACTXINPUTXCONTENTJogosStarter KitsCdigoContedoComponentesLegendaXNA j provVoc criaComunidaden5/26/2009 2:05 PM5Arquitetura de um programa XNAAo se criar um projeto, so gerados dois arquivos:Program.csGame1.cs

Alm disso, gerado um sub-projeto de contedo, dentro da pasta Content, que responsvel por armazenar e compilar todo o contedo (sons, texturas, modelos 3D, etc) do jogonArquitetura de um programa XNAProgram.cs

static void Main(string[] args){using (Game1 game = new Game1()) { game.Run(); -> Executa o Game Loop }}nArquitetura de um programa XNAClasseGame a central da arquitetura XNATem, internamente, um game loop chamado a cada 1/60 de segundo (default)Propriedade TargetElapsedTime pode mudar esta velocidadeA cada execuo do game loop, so chamados mtodos especficos para atualizar o jogo e executar as rotinas de desenho

nArquitetura de um programa XNAGame1.csConstrutor cria o objeto Graphics e indica o diretrio do sub-projeto de contedo, referenciado pelo objeto Contentpublic Game1(){graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content";}

A classe Game1 possui 5 mtodos que sero usados pelo programador para incluir as rotinas especficas do jogo (detalhes nos prximos slides) nArquitetura de um programa XNAMtodos chamados pela classe Game (1/2)Initialize()Chamado quando o jogo carregaOnde se inicializam os recursos no grficosPor exemplo, Mousehelper, Som, etc

LoadContent()Chamado sempre que necessrio carregar os recursos (contedos) grficosIsso pode acontecer no incio do jogo, ou quando a janela (no Windows) sai de trs de outra janela, ou quando por algum erro se perde a referncia ao dispositivo (device) de videonArquitetura de um programa XNAMtodos chamados pela classe Game (2/2)UnloadContent()Chamado sempre que necessrio liberar os recursos (contedos) grficos

Mtodos chamados a cada game loop:Update(GameTime gameTime)Onde se coloca a lgica principal do jogo (clculos)

Draw(GameTime gameTime)Onde se colocam as rotinas de desenho do jogonArquitetura de um programa XNAGameTimePassado como parmetro para os mtodos Update e DrawTem propriedades que permitem ler o tempo transcorrido desde a ltima chamada e desde o incio do jogoO tempo pode ser lido em:Real Time: tempo em segundos reais (relgio) o usado por quase todas as aplicaesGame Time: nmero de passos fixos executados conforme o clock da mquina. Como no reflete o tempo de relgio, a performance de um jogo que se baseie em Game Time pode variar conforme a performance da mquina, caso no se tenha cuidado. Pode ser usado para criar jogos com performance controlvel via programa, setando-se a propriedade IsFixedTimeStep do objeto Game para false (executa jogo em full speed, ignorando a propriedade TargetElapsedTime)Propriedade IsRunningSlowly indica se o TargetElapsedTime no est sendo atingido

nDesenho de objetos 2D

nDesenho de objetos 2DTrs passos:Criar uma varivel do tipo Texture2D na classe Game1Incluir a textura no subprojeto ContentCarregar a textura na varivel via Content Pipeline, no mtodo LoadContentMostr-la na tela no mtodo Draw, usando o objeto spriteBatch j criado pelo XNA

Vejamos isso na prtica

nDesenho de objetos 2DNa classe Game 1:Texture2D textura; SpriteBatch spriteBatch;

No construtor da classe (opcional):// Definir - o tamanho da janela (se em modo janela) OU // - a resoluo (se em modo tela cheia)graphics.PreferredBackBufferWidth = 400;graphics.PreferredBackBufferHeight = 400;

No mtodo LoadContent:protected override void LoadContent(){textura = Content.Load("xna_thumbnail");}nDesenho de objetos 2DNo necessrio descarregar a textura no mtodo UnloadContentTodo contedo carregado via ContentPipeline gerenciado totalmente por ela, inclusive a liberao de recursos no mais usadosnDesenho de objetos 2DNo Mtodo Draw:

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

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);spriteBatch.Draw(textura, Vector2.One, Color.White);spriteBatch.End();

base.Draw(gameTime);}nCarregando texturasProjeto: XNA 3.0 Demo - Desenho textura

nComponents de um game

nComponents de um gameColeo Components da Classe GameInforma ao XNA quais os componentes do jogoPassos para criar um componente:Criar uma classe derivada de GameComponent ou de DrawableGameComponentCriar um objeto desta classeAdicionar o objeto ao Game usando:this.Components.Add( objeto );

O XNA automaticamente chama os mtodos:GameComponent: mtodo Update DrawableGameComponent: mtodos Update e Draw

nComponents de um game1. Criar uma classe derivada de GameComponent (1/2)

class clsSprite : GameComponent{ public Texture2D textura; // sprite texture public Vector2 posicao; // sprite posicao on screen public Vector2 velocidade; // velocidade in pixels

public clsSprite(Game game, Texture2D Textura, Vector2 Posicao) : base(game) { textura = Textura; posicao = Posicao; }}nComponents de um gameCriar uma classe derivada de GameComponent (2/2)

public override void Update(GameTime gameTime){ // ajusta a velocidade para no sair pelas bordas da tela if(posicao.X + textura.Width + velocidade.X > this.Game.Window.ClientBounds.Width) velocidade.X = -velocidade.X; // direita if (posicao.Y + textura.Height + velocidade.Y > this.Game.Window.ClientBounds.Height) velocidade.Y = -velocidade.Y; // de baixo if (posicao.X + velocidade.X < 0) velocidade.X = -velocidade.X; // esquerda if (posicao.Y + velocidade.Y < 0) velocidade.Y = -velocidade.Y; // de cima // Atualiza a posio posicao += velocidade;}

nComponents de um gamePara fazer clculos com o gameTime, para independncia da velocidade da mquina:// Tempo (em segundos) para mostrar cada tela// 0.02 quer dizer que teremos 50 telas por segundo (0.02 fDurao x 50 telas = 1 segundoprivate float fDuracao = 0.02f;// Tempo que passou desde a ltima tela desenhadaprivate float fTimer = 0.0f; public void Update(GameTime gameTime){ fTimer += (float)gameTime.ElapsedGameTime.TotalSeconds; if (fTimer > fDuracao) { fTimer = 0.0f; // Aqui entra o cdigo de atualizao da sprite (slide anterior) }}nComponents de um game2. Criar um objeto desta classe3. Adicionar o objeto ao Game

private clsSprite Desenho2D;...

protected override void LoadContent(){... // Load a 2D texture sprite Desenho2D = new clsSprite(this, content.Load("xna_thumbnail"), Vector2.One); Desenho2D.velocidade = new Vector2(1, 2); this.Components.Add(Desenho2D);}nComponents de um gameComo criamos um classe herdada de GameComponent (e no de DrawableGameComponente) precisamos criar um mtodo de desenho e explicitamente invoc-lo a partir da classe Game Na clsSprite:public void Draw(SpriteBatch spriteBatch){ spriteBatch.Draw(textura, posicao, Color.White);} E no mtodo Draw da classe Game1:... spriteBatch.Begin(SpriteBlendMode.AlphaBlend); Desenho2D.Draw(spriteBatch); spriteBatch.End();...A vantagem disso que podemos usar um s spriteBatch para desenhar todas as sprites => melhor performancenCriando Game ComponentsProjeto: XNA 3.0 Demo - Game Component

nDesafioCriar classe herdada de GameComponent que desenhe uma sprite com transparncia e colisoProjeto: XNA 3.0 Demo - Desafio 2D

nDesafio - DicasA cor magenta permite a criao de reas transparentes

Como calcular coliso de dois crculos, para sprites que armazenem o raio e o centro:public bool CircleCollides(clsSprite otherSprite){ return (Vector2.Distance(this.center, otherSprite.center) < this.radius + otherSprite.radius);}

nDiviso dos grupos para o projeto da matriaDividir a turma em grupos de no mximo 5 alunos cada

Cada grupo dever definir o jogo que ir produzir para avaliao ao fim da matria

Entregar um GDD (GDD = Game Design Document documento de definio de jogo) na prxima aulan

Perguntas?n5/26/2009 2:05 PM30