XNA Game Studio Tutorial Criando um jogo com XNA em 1 hora Alexandre Santos Lobão contato@AlexandreLobao.com
Quem sou eu? www.alexandrelobao.com
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
4/7/2017 3:43 PM 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
Universidade Canal de talentos Technology Crescimento 4/7/2017 3:43 PM Universidade Canal de talentos Technology Crescimento
XNA Game Studio 2006 2007 2008 Desenvolvimento para Xbox 360 4/7/2017 3:43 PM 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
Componentes do XNA Game Studio 4/7/2017 3:43 PM Componentes do XNA Game Studio Framework Graphics Audio Input Math Storage Network
Pipeline de Conteúdo (content pipeline) 4/7/2017 3:43 PM XNA Framework Camadas Jogos Starter Kits Código Conteúdo Componentes Framework Framework (extensões) Modelo de Aplicação Pipeline de Conteúdo (content pipeline) Framework (núcleo) Graphics Audio Input Math Storage Network Plataforma Direct3D XACT XINPUT XCONTENT Legenda XNA já provê Você cria Comunidade
Arquitetura de um programa XNA Ao se criar um projeto, são gerados dois arquivos: Program.cs Game1.cs
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
XNA Framework - Graphics 4/7/2017 3:43 PM 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
Tutorial – passo 1 Carregando texturas Bola, tijolos e bastão
Desenho de objetos 2D Na classe game1: No Método LoadGraphics: 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();
“Components” de um game Coleção Components da Classe Game Informa ao XNA quais os componentes do jogo Passos para criar um componente: Criar uma classe derivada de GameComponent Criar um objeto desta classe Adicionar o objeto ao Game usando: this.Components.Add( objeto ); O XNA automaticamente chama os métodos Update e Draw do objeto, se existirem
“Components” de um game Uma classe derivada de GameComponent 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; }
Tutorial – passo 2 Criando um game component Movimentando a bola
XNA Framework - Input Xbox 360 controller 11 botões 4/7/2017 3:43 PM 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);
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;
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;
Tutorial – passo 3 Recebendo input do usuário Controle do bastão com o gamepad
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; }
Tutorial – passo 4 Detecção de colisão Fazendo a bola quicar no bastão e tijolos
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
Uso de Audio com XACT Para incluir um som no jogo: Gerar o arquivo de som XACT Incluir o arquivo no jogo Utilizar o som via Content Pipeline
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(); } Utilizar o som via Content Pipeline
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(); Utilizar o som via Content Pipeline
Tutorial – passo 5 Colocando som no jogo Música de fundo e efeitos sonoros
Uso de Fontes no XNA Incluir novo item do tipo “SpriteFont” Configurar parâmetros da fonte <FontName>Arial</FontName> <Size>14</Size> <Spacing>2</Spacing> <Style>Regular</Style> <CharacterRegion> <Start> </Start> <End>~</End> 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();
Tutorial – passo 6 Escrevendo com XNA Número de vidas, game over
Conclusões
Há diversas comunidades… 4/7/2017 3:43 PM Há diversas comunidades… Dezenas (centenas?) de comunidades ativas! Dezenas (centenas?) jogos – muitos com fonte aberto!
E diversos “Starter Kits”… 4/7/2017 3:43 PM E diversos “Starter Kits”…
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/
Livros
Alexandre Lobão www.AlexandreLobao.com 4/7/2017 3:43 PM Alexandre Lobão Professor da pós-graduação em Jogos Eletrônicos do IESB Colunista da Revista Oficial do Xbox 360 Escritor e roteirista www.AlexandreLobao.com