350 likes | 527 Vues
XNA Game Studio Tutorial Criando um jogo com XNA em 1 hora. Alexandre Santos Lobão contato@AlexandreLobao.com. Quem sou eu?. 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. Proposta.
E N D
XNA Game Studio Tutorial Criando um jogo com XNA em 1 hora Alexandre Santos Lobão contato@AlexandreLobao.com
www.alexandrelobao.com Quem sou eu?
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
Proposta Iniciativa da Microsoft parafacilitar e popularizar o desenvolvimento de jogosdigitais, permitindo a suacriaçãoatravés de linguagemC#e ricasAPIsde desenvolvimento
Universidade Canal de talentos Technology Crescimento
XNA Game Studio • Desenvolvimentopara Xbox 360 • Arquitetura simples paracriação de jogos 2006 2007 • Multiplayer, Visual Studio • Adotadoem 700 universidadesamericanas • 4 contratosXBLA nacompetição Dream Build Play 2008 • Jogosdacomunidade no Xbox LIVE • Desenvolvimento de jogospara Zune • SuporteaoXbox LIVE Arcade
Network Graphics Audio Input Math Storage Componentes do XNA Game Studio Framework
XNA Framework Camadas Jogos Starter Kits Código Conteúdo Componentes Framework (extensões) Framework Modelo de Aplicação Pipeline de Conteúdo(content pipeline) Framework (núcleo) Graphics Audio Input Math Storage Network Plataforma Direct3D XACT XINPUT XCONTENT XNA jáprovê Vocêcria Comunidade Legenda
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 • Fornece recursos de renderização de baixo nível • Construídoemcima do Direct3D 9 • Recursosoferecidos • Model, Mesh, Bones • Texturas • Efeitos e Shaders • BasicEffectfacilitaapresentarobjetos 3D • SpriteBatchpara 2D e partículas
Tutorial – passo 1 • Carregando texturas • Bola, tijolos e bastão
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();
“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 • 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 ContentPipeline • Criação dos objetos // Audio objects AudioEngineaudioEngine; WaveBankwaveBank; SoundBanksoundBank; 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(); }
Uso de Audio com XACT Utilizando sons via ContentPipeline • 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(); // Pararoucontinuar a música if (myLoopingSound.IsPaused) myLoopingSound.Resume(); else myLoopingSound.Pause();
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étodoDraw() 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
Hádiversascomunidades… Dezenas (centenas?) jogos – muitoscom fonteaberto! Dezenas (centenas?) de comunidadesativas!
Porondecomeçar? • Baixe o XNA Game Studio hojemesmo! • Baixeessaapresentação e outrosrecursos 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/
AlexandreLobão Professor dapós-graduaçãoemJogosEletrônicos do IESB ColunistadaRevistaOficial do Xbox 360 Escritor e roteirista www.AlexandreLobao.com