Projeto Conceitual de Jogos Desenvolvendo Jogos em J

  • Slides: 28
Download presentation
Projeto Conceitual de Jogos Desenvolvendo Jogos em J 2 ME para celulares Aula 2

Projeto Conceitual de Jogos Desenvolvendo Jogos em J 2 ME para celulares Aula 2 Prática de jogos em J 2 ME Saulo Souto saulo. souto@meantime. com. br Geber Ramalho glr@cin. ufpe. br 18 de setembro, 2006 1

Exercício 1 - Criar o famigerado “Alô mundo!” - Conceitos de Display - Criação

Exercício 1 - Criar o famigerado “Alô mundo!” - Conceitos de Display - Criação e exibição de um High-Level Displayable - Conceitos de adição e tratamento de Comandos 18 de setembro, 2006 2

Exercício 2 - Incrementar o “Alô Mundo” - Conceitos de Graphics e suas funções

Exercício 2 - Incrementar o “Alô Mundo” - Conceitos de Graphics e suas funções Fontes Criação e exibição de um Low-Level Displayable Tratamento de teclas Criação e renderização de Imagens 18 de setembro, 2006 3

Nosso Jogo! Shot´em up game simplificadíiiiiissimo!! n“ Star Hero é um jogo singleplayer, no

Nosso Jogo! Shot´em up game simplificadíiiiiissimo!! n“ Star Hero é um jogo singleplayer, no estilo shoot’em up. O jogo consiste em uma espaçonave controlada pelo jogador que trafega pelas galáxias, atirando em inimigos. Essas ações resultam em pontos para o jogador. O objetivo do jogo é acumular o máximo de pontos possíveis. ” n 18 de setembro, 2006 4

Já Temos as Características. . . Work! n Projetando as classes. Precisamos de: –

Já Temos as Características. . . Work! n Projetando as classes. Precisamos de: – Um MIDlet (óbvio!) – Uma classe que trata os comandos alto-nível e possui o – – – looping básico do jogo (lê entrada, atualiza estado e pinta a tela) Uma classe que representa um elemento do jogo (Sprite) Uma classe representando a nave Uma classe representando os inimigos Uma classe representando as balas Uma classe representando a tela principal com a lógica principal do jogo Uma classe com todas as constantes (facilitar o acesso) 18 de setembro, 2006 5

Projeto de classes Sprite set. X() set. Y() intersects() update() draw() MIDlet <<extends>> Enemy

Projeto de classes Sprite set. X() set. Y() intersects() update() draw() MIDlet <<extends>> Enemy <<extends>> Command. Listener Ship. Midlet start. App() pause. App() destroy. App() update() draw() <<extends>> Ship update() draw() Fire * Runnable update() draw() <<implements>> * <<implements>> Ship. Controller Ship. Game. Screen run() set. Paused() set. Game. Over() command. Action() load. Game. Objects() update() paint() key. Pressed() 18 de setembro, 2006 Constants 6

Constants n Comandos do jogo Características dos objetos Características do aparelho (largura e altura)

Constants n Comandos do jogo Características dos objetos Características do aparelho (largura e altura) Imagens usadas pelos objetos n Método para carregar as imagens (load. Images()) n n n 18 de setembro, 2006 7

Ship. Midlet n n n Possui referência para a tela principal do jogo Possui

Ship. Midlet n n n Possui referência para a tela principal do jogo Possui referência para o controlador do jogo Inicializa os objetos acima no start. App() Inicializa o looping do jogo no controlador Mostra a tela do jogo 18 de setembro, 2006 8

Ship. Controller n n n Thread que contêm o looping do jogo Trata todos

Ship. Controller n n n Thread que contêm o looping do jogo Trata todos os comandos “alto nível”do jogo Controla o estado de pause/resume do jogo (lembrar que não tem relação com o pause. App()) 18 de setembro, 2006 9

Sprite n n n Posição x e y na tela Altura e largura Representação

Sprite n n n Posição x e y na tela Altura e largura Representação gráfica Detecção de colisão Velocidades horizontal e vertical Métodos abstratos update() e draw() 18 de setembro, 2006 10

Ship n n n É um Sprite Array de balas Indicação se a nave

Ship n n n É um Sprite Array de balas Indicação se a nave está explodindo Animação das imagens Métodos para mover a nave (exercício) Método pra disparar balas (exercício) 18 de setembro, 2006 11

Fire n n É um Sprite Renderiza a imagem (exercício) – Não possui animação

Fire n n É um Sprite Renderiza a imagem (exercício) – Não possui animação (uma imagem apenas) n n Tratamento ao sair da tela Atualiza a posição, dada a velocidade (exercício) 18 de setembro, 2006 12

Enemy n n n É um Sprite Possui um comportamento ingênuo (randômico) Imagens animadas

Enemy n n n É um Sprite Possui um comportamento ingênuo (randômico) Imagens animadas 18 de setembro, 2006 13

Ship. Game. Screen n n n Inicializa e possui todos os objetos do jogo

Ship. Game. Screen n n n Inicializa e possui todos os objetos do jogo (Nave, Inimigos e Balas) (exercício) Centraliza a atualização dos estados objetos (exercício) Controla colisão de balas com inimigos (exercício) Controla colisão de inimigos com a nave (exercício) Renderiza todos os objetos (exercício) Controla e pinta informações do jogo (pontuação, level e vidas) Trata pressionamento das teclas (esquerda, direita e fire) (exercício) 18 de setembro, 2006 14

BUILD & RUN! 18 de setembro, 2006 15

BUILD & RUN! 18 de setembro, 2006 15

Limitações – Tamanho das telas – Memória heap – Número de cores – Som

Limitações – Tamanho das telas – Memória heap – Número de cores – Som – Tamanho do JAR – Latência da rede – Custo alto no uso da rede 18 de setembro, 2006 16

Otimize, se necessário n Obfuscadores para diminuir tamanho de código – Proguard, Retroguard, etc.

Otimize, se necessário n Obfuscadores para diminuir tamanho de código – Proguard, Retroguard, etc. n n n n Cautela no uso de herança e excesso de classes Evite usar classes anônimas ou aninhadas Acessos a variáveis estáticas e métodos estáticos é mais rápido Arrays no lugar de Vectors Loops de trás pra frente (comparação com 0, null e false é mais rápida) Reuse objetos Cuidado no uso de Strings 18 de setembro, 2006 17

Otimização (cont. ) n Combine várias imagens em uma só 1 PNG 0. 7

Otimização (cont. ) n Combine várias imagens em uma só 1 PNG 0. 7 k 4 PNG 1. 6 k n n n Número de cores das imagens Uso do Clip pra pintura Preocupações – Tamanho do Jar (64 k ~ 100 k) – Memória (200 k ~ 600 k) – Processamento (5 fps ~ 10 fps) 18 de setembro, 2006 18

Exercício (Portar para MIDP 2. 0) n n n Fazer nosso Sprite herdar do

Exercício (Portar para MIDP 2. 0) n n n Fazer nosso Sprite herdar do Sprite de MIDP 2. 0 Usar colisão do sprite de MIDP 2. 0 Usar Game. Canvas – Usar tratamento de teclas usando get. Key. States() – Usar back buffer usando get. Graphics() – Usar full screen n Adição de som (sugestão MIDI) 18 de setembro, 2006 19

Pacote Jogos MIDP 2. 0 n MIDP 2. 0 Packages: – javax. microedition. lcdui.

Pacote Jogos MIDP 2. 0 n MIDP 2. 0 Packages: – javax. microedition. lcdui. game lcdui Layer * Tiled. Layer Sprite Layer. Manager Displayable Game. Canvas – Vide API · http: //java. sun. com/javame/reference/apis/jsr 118/ 18 de setembro, 2006 20

Sprite s. set. Frame. Sequence(new int[]{0, 1, 2, … , 1, 1}); Sprite s

Sprite s. set. Frame. Sequence(new int[]{0, 1, 2, … , 1, 1}); Sprite s = new Sprite(image, frame. Width, frame. Height); s. move(10, 0); s. next. Frame(); 18 de setembro, 2006 21

Herdar Sprite de MIDP 2. 0 n Passos gerais – Fundir imagens separadas –

Herdar Sprite de MIDP 2. 0 n Passos gerais – Fundir imagens separadas – Usar frame sequence no lugar de vetores de imagens – Alterar classe Sprite para herdar do Sprite do MIDP 2. 0 – Alterar classes dos objetos para adaptações da nova interface de Sprite 18 de setembro, 2006 22

Herdar Sprite de MIDP 2. 0 n Detalhando. . – Fundir imagens separadas ·

Herdar Sprite de MIDP 2. 0 n Detalhando. . – Fundir imagens separadas · Adaptar método Contants. load. Images() (exercício) · Transformar vetores de imagens em frame sequences na classe – – – Constants (exercício) Alterar classe Sprite · Declarar herança · Remover declaração de campos já herdados · Delegar posicionamento a métodos do Sprite MIDP 2. 0 (exercício) · Adaptar interface do construtor para receber frame sequence · Implementar draw() usando Sprite. paint() Usar frame sequence para controlar as animações nas classes Ship, Enemy e Fire · Converter chamadas a set. Image(…) em set. Frame. Sequence(…) · Inicializar frame sequences nos contrutores e nas mudanças de estado das classes (exercício) · Remover métodos draw(). Atualizar frames no update() Adaptar inicialização das classes usando novo construtor · Adaptar classe Ship. Game. Screen para passar frame sequence no lugar do vetor de imagens (exercício) 18 de setembro, 2006 23

Melhorias no uso de MIDP 2. 0 üFazer nosso Sprite herdar do Sprite de

Melhorias no uso de MIDP 2. 0 üFazer nosso Sprite herdar do Sprite de MIDP 2. 0 n n Usar colisão do sprite de MIDP 2. 0 Usar Game. Canvas – Usar tratamento de teclas usando get. Key. States() – Usar back buffer usando get. Graphics() – Usar full screen n Adição de som (sugestão MIDI) 18 de setembro, 2006 24

Um pouco mais sobre porte n n n Importância do porte – Boa parte

Um pouco mais sobre porte n n n Importância do porte – Boa parte do desenvolvimento (~ 40%) – Pensar no porte desde o projeto do jogo Exemplos de variações – Tamanho de tela – API de som – Versão MIDP – Bugs do celular – Idioma – Funcionalidades do jogo – etc… Escala – Chega-se a gerar +1000 versões de uma aplicação 18 de setembro, 2006 25

Boas práticas para o porte n Manter código único – Pré-processamento //#ifdef <symbol> ·

Boas práticas para o porte n Manter código único – Pré-processamento //#ifdef <symbol> · http: //antenna. sourceforge. net/ · http: //eclipseme. org/index. html – Aspectos · Pesquisas acadêmicas n Sistemas de build – Responsável por gerar as várias versões da aplicação – Pré-processa código antes de compilar – Gerencia resources: seleciona arquivos (imagens, sons, – etc) por versão Empacota tudo gerando executáveis (jar e jad) – http: //ant. apache. org/manual/ 18 de setembro, 2006 26

Dicas finais n Sites interessantes – http: //www. forum. nokia. com – http: //www.

Dicas finais n Sites interessantes – http: //www. forum. nokia. com – http: //www. motocoder. com – http: //wireless. java. sun. com – http: //www. microjava. com – http: //www. midlet-review. com n Listas de discussão – kvm-interest – j 2 me-brasil 18 de setembro, 2006 27

Obrigado! Dúvidas? saulo. souto@meantime. com. br 18 de setembro, 2006 28

Obrigado! Dúvidas? saulo. souto@meantime. com. br 18 de setembro, 2006 28