XNA Game Studio Tutorial Criando um jogo com XNA em 1 hora Alexandre Santos Lobão [email protected] Quem sou eu? www.alexandrelobao.com 2 2 Agenda Visão Geral do XNA Tutorial – um jogo em 1 hora Gráficos Game Components Input Detecção de Colisão Sons Uso de fontes 3 Proposta Iniciativa da Microsoft para facilitar e popularizar o desenvolvimento de jogos digitais, permitindo a sua criação através de linguagem C# e ricas APIs de desenvolvimento 4 5 XNA Game Studio 2006 Desenvolvimento para Xbox 360 Arquitetura simples para criação de jogos 2007 Multiplayer, Visual Studio Adotado em 700 universidades americanas 4 contratos XBLA na competição Dream Build Play 2008 Jogos da comunidade no Xbox LIVE Desenvolvimento de jogos para Zune Suporte ao Xbox LIVE Arcade 6 Componentes do XNA Game Studio Graphics Audio Math Storage Framework Input Network 7 Camadas Jogos Framework (extensões) Starter Kits Código Modelo de Aplicação Conteúdo Componentes Pipeline de Conteúdo (content pipeline) Framework Framework Graphics (núcleo) Plataforma Legenda Direct3D XNA já provê Audio Input XACT Você cria Math XINPUT Storage Network XCONTENT Comunidade 8 Arquitetura de um programa XNA Ao se criar um projeto, são gerados dois arquivos: Program.cs Game1.cs 9 Arquitetura de um programa XNA Métodos chamados pela classe Game Initialize() Inicializações gerais do jogo LoadContent() Chamado sempre que é necessário carregar os recursos (conteúdos) UnloadContent() Chamado sempre que é necessário liberar os recursos (conteúdos) A cada game loop: Update Onde se coloca a lógica principal do jogo (cálculos) Draw Onde se colocam as rotinas de desenho do jogo 10 XNA Framework - Graphics Fornece recursos de renderização de baixo nível Construído em cima do Direct3D 9 Recursos oferecidos Model, Mesh, Bones Texturas Efeitos e Shaders BasicEffect facilita apresentar objetos 3D SpriteBatch para 2D e partículas 11 Tutorial – passo 1 Carregando texturas Bola, tijolos e bastão 12 Desenho de objetos 2D Na classe game1: private Texture2D textura; No Método LoadGraphics: textura = content.Load<Texture2D>("xna_thumbnail"); No Método UnloadGraphics: textura.Dispose(); No Método Draw: SpriteBatch.Begin(SpriteBlendMode.AlphaBlend); SpriteBatch.Draw(textura, Vector2.One, Color.White); SpriteBatch.End(); 13 “Components” de um game Coleção Components da Classe Game Informa ao XNA quais os componentes do jogo Passos para criar um componente: 1. Criar uma classe derivada de GameComponent 2. Criar um objeto desta classe 3. Adicionar o objeto ao Game usando: this.Components.Add( objeto ); O XNA automaticamente chama os métodos Update e Draw do objeto, se existirem 14 “Components” de um game Uma classe derivada de GameComponent class clsSprite : GameComponent { public Texture2D textura; // public Vector2 posicao; // public Vector2 velocidade; // sprite texture sprite posicao on screen velocidade in pixels public clsSprite(Game game, Texture2D Textura, Vector2 Posicao) : base(game) { textura = Textura; posicao = Posicao; } } 15 Tutorial – passo 2 Criando um game component Movimentando a bola 16 XNA Framework - Input Xbox 360 controller 11 botões 2 triggers (alavancas) 2 direcionais analógicos 1 direcional digital Dois motores de vibração GamePadState state = GamePad.GetState(PlayerIndex.One); GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f); 17 Tratamento de input do usuário Podemos ler o estado do GamePad... public override void Update(GameTime gameTime) { ... // Muda a posição usando o thumbstick da esquerda GamePadState gamePad = GamePad.GetState(PlayerIndex.One); Posicao.X += gamePad.ThumbSticks.Left.X; Posicao.Y -= gamePad.ThumbSticks.Left.Y; 18 Tratamento de input do usuário 2. Alterar o método Update para tratar o input do usuário - Teclado public override void Update(GameTime gameTime) { ... // muda a posição usando o teclado KeyboardState keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.Up)) Posicao.Y -= 10; if (keyboardState.IsKeyDown(Keys.Down)) Posicao.Y += 10; if (keyboardState.IsKeyDown(Keys.Left)) Posicao.X -= 10; if (keyboardState.IsKeyDown(Keys.Right)) Posicao.X += 10; 19 Tutorial – passo 3 Recebendo input do usuário Controle do bastão com o gamepad 20 Detecção de colisão Todo jogo precisa disso! public bool Colidiu(clsSprite sprite) { // Verifica se colidiu com a sprite if (this.posicao.X + this.textura.Width > sprite.posicao.X && this.posicao.X < sprite.posicao.X + sprite.textura.Width && this.posicao.Y + this.textura.Height > sprite.posicao.Y && this.posicao.Y < sprite.posicao.Y + sprite.textura.Height) return true; else return false; } 21 Tutorial – passo 4 Detecção de colisão Fazendo a bola quicar no bastão e tijolos 22 Uso de Audio com XACT Para que o som seja utilizável tanto no Windows quanto no Xbox 360, é necessário converter os sons em “Sound banks”, Cada “Sound bank” é composto por “Wave banks” Cada “Wave Bank” arnazena diversos arquivos (formato WAV ou AIF apenas) Formatos mais “profissionais”, sem perda de informação como o MP3 23 Uso de Audio com XACT Para incluir um som no jogo: 1. Gerar o arquivo de som XACT 2. Incluir o arquivo no jogo 3. Utilizar o som via Content Pipeline 24 Uso de Audio com XACT Utilizando sons via Content Pipeline Criação dos objetos // Audio objects AudioEngine audioEngine; WaveBank waveBank; SoundBank soundBank; protected override void Initialize() { audioEngine = new AudioEngine("MySounds.xgs"); waveBank = new WaveBank(audioEngine, "Wave Bank.xwb"); soundBank = new SoundBank(audioEngine, "Sound Bank.xsb"); base.Initialize(); } 25 Uso de Audio com XACT Utilizando sons via Content Pipeline Gerar um efeito sonoro (som sem loop) soundBank.PlayCue("chord"); Tocar música de fundo (som com loop) // Iniciar a música myLoopingSound = soundBank.GetCue("notify"); myLoopingSound.Play(); // Parar ou continuar a música if (myLoopingSound.IsPaused) myLoopingSound.Resume(); else myLoopingSound.Pause(); 26 Tutorial – passo 5 Colocando som no jogo Música de fundo e efeitos sonoros 27 Uso de Fontes no XNA 1. Incluir novo item do tipo “SpriteFont” 2. Configurar parâmetros da fonte <FontName>Arial</FontName> <Size>14</Size> <Spacing>2</Spacing> <Style>Regular</Style> <CharacterRegion> <Start> </Start> <End>~</End> 3. Utilizar a fonte Na classe Game1.cs SpriteFont fonteArial; No método Initialize() fonteArial = content.Load<SpriteFont>("FonteArial"); No método Draw() mySpriteBatch.Begin(); mySpriteBatch.DrawString(fonteArial, “Hello World!", Vector2.One, Color.Yellow); mySpriteBatch.End(); 28 Tutorial – passo 6 Escrevendo com XNA Número de vidas, game over 29 Conclusões Há diversas comunidades… 31 E diversos “Starter Kits”… 32 Por onde começar? Baixe o XNA Game Studio hoje mesmo! Baixe essa apresentação e outros recursos XNA no SharpGames! www.sharpgames.net Comunidade brasileira para desenvolvimento de jogos! Artigos, links, downloads, XNA, DirectX, Projeto Hoshimi e muito mais! XNA Developer Center http://msdn.microsoft.com/xna/ XNA Creators Club http://creators.xna.com/ 33 Livros 34 35