introdução ao xna · referências ao controle gráfico (device) e ao objeto de desenho 2d ......
TRANSCRIPT
XNA
Introdução ao XNA
Introdução
XNA Game Studio 3.1 (http://creators.xna.com/)
Visual Studio 2008
Introdução
File → New Project
Introdução
Solution Explorer
Introdução
Estrutura geral de um jogo
Existência de uma rotina que roda em loop, mantendo o jogo
sendo executado mesmo sem a interação do usuário
1. Inicialização gráfica, controles de input e som
2. Carga dos recursos do jogo
3. Inicio do Loop do jogo. Em cada um dos passos:
a. Colocar o input do usuário
b. Realizar cálculos necessários (IA, movimentos, detecção de colisões, etc.)
c. Teste de encerramento – se encontrado para o loop
d. Renderização da tela, geração de sons e resposta aos controle
4. Finalização do controle gráfico, dispositivos de entrada, e som
5. Liberação de recursos
Introdução
Sem uso o XNA toda a parte “pesada” da infra-estrutura
de um jogo tem que ser implementada
O XNA atua encapsulando boa parte dessa complexidade
Quando se cria um projeto XNA, é criado um objeto da
classe Microsoft.Xna.Framework.Game
Introdução
Principais métodos:
Game1() – Inicialização geral(Game1.cs)
Initialize() – Inicialização do Jogo (Game1.cs)
LoadContent() – Carga dos recursos do jogo(Game1.cs)
Run() – Inicio o Loop do jogos (Program.cs). Em cada iteração:
Update() – Leitura do input do usuário, cálculos e etc.(Game1.cs)
Draw() – Código de renderização(Game1.cs)
UnloadContent() – Liberação de recursos (Game1.cs)
Introdução
Inicialização do Jogo
A classe Game1 inicia-se definindo e criando os objetos que serão
referências ao controle gráfico (device) e ao objeto de desenho 2D
(SpriteBatch)
O construtor da classe também configura o diretório raiz da aplicação,
local a partir do qual serão encontrados os recursos do jogo (imagens,
sons e etc)
Introdução
Content Pipeline
Simplifica o processo de utilização de recursos (carga,
armazenamento e etc)
Introdução
Content Pipeline
Ao se incluir um conteúdo ao jogo, utiliza-se um dos
importadores disponíveis no XNA
Normalizando os dados e colocando-os em um formato que seja
fácil de ser lido. Suportando:
Arquivos em formato 3D padrão DirectX e o formato FBX da
Autodesk
Arquivos FX de formato de materiais para renderização em 3D
Arquivos de formato 2D: BMP, DDS, JPG, PNG, e TGA
Fonts
Arquivos XML
Audio: XAP (arquivo da ferramenta XACT), WAV, WMA, e MP3
Introdução
Content Pipeline
Uma vez importados os conteúdos os processadores irão atuar
disponibilizando as informações em objetos acessíveis pelo
jogo.
O gerenciador de conteúdo (content manager) é responsável
pela leitura desses objetos
É possível a criação de novos importers e processadores de
conteúdos.
Introdução
Inicialização do jogo
O método Initialize() é chamada apenas uma única vez antes do
inicio do loop do jogo
Esse método deve ser utilizado para a inicialização de rotinas
não gráficas, como por exemplo, a preparação do conteúdo de
áudio do jogo.
O método também chame o método Initialize da classe base
(pai) chamando os respectivos inicializadores de cada
componente
Os gráficos são carregados em um método separado
LoadContent. Possibilitando a re-carga dos gráficos caso
alguma propriedade gráfica seja alterada.
Introdução
Finalização do jogo
Por utilizar a tecnologia .NET a finalização da aplicação é
simplificada pela atuação do Garbage Collector
Para a codificação de rotina de liberação de recursos próprios
deve ser utilizado o método UnloadContent
Introdução
Game Loop
A maioria do processamento do jogo ocorre dentro do loop
O XNA prover dois métodos que sejam chamados dentro do loop:
Update – aonde deverá ser incluída boa parte da lógica do jogo
Draw – responsável pela renderização dos componentes gráficos do jogo.
Introdução
Game Loop
O principal parâmetro é o gameTime
Através desse parâmetro é possível saber quanto tempo se passou desde do último passo da loop do jogo.
Propriedades:
ElapsedGameTime – informa o tempo de jogo desde da última chamada ao loop do jogo. O loop do jogo é chamada em uma quantidade fixa de vezes por segundo. Utiliza-se o tempo do jogo (ao invés do tempo real) para simplificar. Se a propriedade IsFixedTimeStep é configurada para Trueentão o método Update é chamado em uma quantidade fixa de vezes por segundos.
ElapsedRealTime – informa o tempo real desde da última chamada ao loop do jogo. Se a propriedade IsFixedTimeStep é configurada para False, o loop será chamada na máxima velocidade, quantas vezes forem possíveis por segundo (aumenta a complexidade do jogo mas melhora o tempo de resposta).
Introdução
Game Loop
Propriedades do GameTime
TotalGameTime e TotalRealTime – Total de tempo passado desde o
inicio do jogo, medido em tempo de jogo (unidades fixas por segundo)
ou tempo real (segundos)
IsRunningSlowly – indicativo de que o jogo está chamada o método
Update em quantidade menor do que configurado em
Game.TargetElapsedTime.
Introdução
Game Loop
A classe GamePad referencia o controlador do jogo, sendo
possível por exemplo ativar a vibração.
Esta classe não utiliza buffer para o input do usuário, assim, a
informação obtida é em tempo real.
O método Draw apresenta um código para limpeza da tela e o
preenchimento com uma cor específica.
Gráficos 2D
Termos comuns
Sprite – imagens em 2D que podem ser manipuladas de forma
independente do resto da cena do jogo. Este termo pode
descrever tanto uma imagem quanto uma classe utilizada para
representar a imagem (contendo propriedades: velocidade,
altura...)
Texturas – refere-se a imagens 2D carregada em um modelo
3D, na qual pode ser vista em qualquer ponto de vista.
Billboard – textura mapeada para um plano perpendicular do
eixo da câmera (http://creators.xna.com/en-US/sample/billboard)
Background – imagem de fundo de uma cena. Se o background
apresenta movimento temos um scrolling background
Gráficos 2D
Sistemas de coordenadas
Sistema de coordenadas
padrão
Sistema de coordenadas
de tela (screen)
Gráficos 2D
Exibindo um Sprite
Gráficos 2D
Adicionando um conteúdo
Gráfico 2D
Visualizando as propriedades do conteúdo
Gráficos 2D
Exibindo o Sprite
Pode-se utilizar o método Draw da classe Game através do
Spritebatch
Criar um método Draw na classe clsSprite
Gráficos 2D
Exibindo o Sprite
Deve-se incluir a definição da classe clsSprite no inicio da
classe game:
Gráficos 2D
Carregando o Sprite
Gráficos 2D
Liberando recursos
Gráficos 2D
Desenhando o Sprite
Gráficos 2D
Gráficos 2D
Alterando o tamanho da janela
Gráficos 2D
Movendo um sprite
A utilização de coordenadas de tela facilita o processo de
deslocamento de um objeto.
Incrementando a coordenada X o sprite move para direita,
decrementando a coordenada X o sprite move para esquerda
Aumentando a coordenada Y o sprite move para baixo,
diminuindo a coordenada Y o sprite move para cima.
Deve-se alterar a posição de um sprite no evento Draw da
classe games.
Gráficos 2D
Movimentando um sprite
Alterando a classe sprite para conter uma nova propriedade
velocity (controlar a velocidade em X e Y)
Gráficos 2D
Movimentando um sprite
Alterando o construtor da classe para receber a largura e altura
da tela
Gráficos 2D
Movimento um sprite
Alterando a chamada do construtor da classe sprite
Gráficos 2D
Movimento um sprite
Alterando a carga do sprite para indicar a velocidade inicial de
sendo 1 pixel em cada coordenada
Gráficos 2D
Movimento um sprite
Criar um método de controle de movimento na classe sprite
Gráficos 2D
Movimento um sprite
Alterando o método Draw para gerar o movimento
Colisão
Existem vários algoritmos para detecção de colisão de
dois sprites
O teste de colisão não é realizado analisando todos os
pixels dos objetos envolvidos
Realiza-se uma simplificação da forma do objeto para
facilitar os cálculos
Colisão
Uma forma simples de se detectar colisão é checar as
coordenadas x,y do canto superior da primeira caixa está
dentro da caixa que contém o segundo elemento.
Colisão
Colisão
Inserindo o segundo sprite e verificando a colisão
Colisão
Quando se testa colisão entre circulos (objetos com
geometria circular), verifica-se se a distância entre os
centros é menor que a soma dos dois raios
Raio Raio
Colisão
Criando duas propriedades do sprite:
Colisão
Código para detectar a colisão dos circulos
Game Input
Game Input
Usando o teclado para alterar o posicionamento do sprite
Game Input
Usando o mouse