590 likes | 739 Views
Projeto Conceitual de Jogos. Desenvolvendo Jogos em Java ME para celulares. Aula 1 Introdução à Java ME. Tarcisio Camara t arcisio.camara@meantime.com.br Geber Ramalho glr@cin.ufpe.br. Sobre quem vos fala.
E N D
Projeto Conceitual de Jogos Desenvolvendo Jogos em Java ME para celulares Aula 1Introdução à Java ME Tarcisio Camara tarcisio.camara@meantime.com.br Geber Ramalho glr@cin.ufpe.br
Sobre quem vos fala... • Meantime Mobile Creations – Empresa incubada no C.E.S.A.R focado no desenvolvimento de jogos e aplicativos, baseados em dispositivos móveis, para usuários finais • Um dos pioneiros mundiais (desde 2001) na tecnologia J2ME • Várias tecnologias wireless: J2ME, BREW, WAP, SMS e MMS • Atualmente, distribui jogos para EUA, Europa e alguns países da América Latina e Ásia • Parceria com diversos fabricantes, publishers e operadoras • Produzimos mais de 40 jogos para celulares (alguns para a Motorola, Sony Ericsson, etc) • Atua como publisher no Brasil, com parceria com todas as operadoras
Agenda • Mercado de jogos wireless • Principais tecnologias • Introdução a Java ME • Wireless Game Design • Criando nosso Jogo • Sugestão de Melhorias • Dicas de performance / redução de código
Mobile Portal Publisher Mercado: Cadeia de Valor • Ciclo de desenvolvimento deve ser rápido (<6 meses) • Retorno do investimento lento Fluxo de produção >>> Developer Mobile Portal Brands Publisher Carrier End-user Technology <<< Fluxo de receita (R$)
Mercado: Visão geral • Principais Players: EA Mobile (Jamdat), Gameloft (Ubi Software), Glu Mobile, Digital Chocolate, Hands On e I-Play. • Empresas com atuação mundial • Faturamentos crescentes e superiores a 60 milhões de dólares por ano • Modelo de negócios padrão: revenue share em cima das vendas das operadoras para os usuários finais • Mercando em processo de consolidação
Principais Tecnologias • SMS/MMS • Jogos baseados na troca de mensagens (forca, quiz, penalty, etc.) • WAP/xHTML/iMODE • Jogos baseados em páginas estáticas (velha, pedra papel tesoura, etc.) • Brew (Binary Runtime Environment for Windows) • Ambiente de execução para chipset Qualcomm • C++ e API definida pela Qualcomm (animações, som, recursos de rede, etc...) • Principal mercado: EUA • Java ME • Java otimizado para dispositivos com limitações • Adotado por todos os maiores players do mercado • API’s especificadas pela comunidade JCP • Padrão do mercado
Telefones Java (>650 dispositivos) http://developers.sun.com/techtopics/mobility/device/pub/device/list.do 20 dispositivos por página
Introdução a plataforma J2ME SERVIDOR DESKTOP CELULARES SMART- CARDS
Arquitetura Java ME Application Profiles Configuration: Libraries KVM Host Operating System Device Hardware
Java Community Process (JCP) Java Specification Request (JSR) http://java.sun.com/javame/technology/jcp.jsp Universo Java ME Hoje…
Configurações • Uma especificação que define o ambiente de software para uma família de dispositivos, geralmente: • Os tipos e quantidade de memória disponível • Tipos de processadores e velocidade • Tipo de conexão de rede • Inclui um conjunto básico de classes Java • É especificada pela JCP • Connected Device Configuration (CDC) • High end consumer devices • PDA, TV set-top boxes, etc • Connected, Limited Device Configuration (CLDC) • Low end consumer devices • Cell phones, limited PDAs, etc
CLDC 1.0 • CLDC - Connected Limited, Device Configuration • Dispositivos limitados com poucos recursos • Processador de, no mínimo 8 Mhz • A partir de 160 K de memória heap reservada pra Java • Acesso a rede com pouca largura de banda • Target Devices • Celulares • Two Way Pagers • Personal Organizers • etc.
Escopo do CLDC • Define: • Linguagem Java e características da VM • I/O • Networking framework • Segurança • Internacionalização • Não define: • Gerenciamento do ciclo de vida da aplicação (instalação, execução, deleção) • Interface com o usuário • Tratamento de eventos • Interação entre usuário e aplicação (comandos, etc…)
Limitação do CLDC • CLDC 1.0 possui algumas limitações: • Ausência de ponto flutuante • Ausência de Weak References • Ausência de Finalização • Não existe o método finalize() no CLDC • Não possui suporte a JNI. • Não possui a API de Reflection. • Ausência de daemon-threads e thread groups. • Limitação no suporte a Internacionalização • Permite a conversão de byte stream para Unicode e vice-versa • Limitação no tratamento de Erros • Apenas duas classes: java.lang.VirtualMachineError, java.lang.OutOfMemoryError
Limitação do CLDC • CLDC 1.1 adiciona alguns recursos ao CLDC 1.0: • Adição de ponto flutuante • Adição de Weak Reference • Adição de suporte a nomes de Threads • Memória mínima de 162 para 192 kbytes
Pacotes do CLDC • Herdados do J2SE • java.lang • java.io • java.util • Específicos do CLDC • javax.microedition.io
Profiles • Um profile ou “perfil” é uma coleção de API´s em Java que complementa uma configuração a fim de prover habilidades para uma família de dispositivos • É especificada pela JCP • O principal objetivo é garantir a interoperabilidade entre uma família de dispositivos. • MIDP (Mobile Information Device Profile): Principal e presente na maioria absoluta dos dispositivos • MIDP 1.0 • MIDP 2.0 • MIDP 2.1 • MIDP 3.0 (em breve)
MIDP • Mobile Information Device Profile (MIDP). • MIDP define: • Interface com o Usuário • Persistência (usando um modelo simples orientado a registros) • Networking (estende o Generic Connection framework do CLDC) • Ciclo de vida da Aplicação • Tratamento de eventos (teclas, interrupção, etc.) • Requisitos de Hardware
Pacotes do MIDP 1.0 • MIDP Packages: • javax.microedition.midlet • javax.microedition.midlet.MIDlet • javax.microedition.lcdui • javax.microedition.rms • javax.microedition.rms.RecordStore
game lcdui * Layer LayerManager Displayable TiledLayer Sprite GameCanvas Canvas Pacotes adicionais do MIDP 2.0 • MIDP 2.0 Packages: • javax.microedition.media • javax.microedition.media.Player • javax.microedition.media.Control • javax.microedition.media.control • javax.microedition.media.control.VolumeControl • javax.microedition.lcdui.game • javax.microedition.io • javax.microedition.io.PushRegistry
O que é um MIDlet • É uma aplicação MIDP: • Possui uma classe Java que estende da classe MIDlet e implementa os seguintes métodos: • startApp() • pauseApp() • destroyApp() • Possui um modelo de ciclo de vida similar aos Applets (explicado adiante).
O que é um MIDlet (cont.) • Gerenciado pelo “Java Application Manager” (JAM) • Uma aplicação que deve vir acompanhando a implementação do MIDP e que controla a instalação, execução e remoção dos MIDlets • Provê o ambiente de execução dos MIDlets • Trata todos os erros ocorridos durante a instalação e execução dos aplicativos sem “derrubar” o dispositivo
MIDlet Suites e Descritores (JAD) • Uma MIDlet Suite é um conjunto de MIDlets (e seus arquivos) empacotados em um JAR • Uma suite deve possuir pelo menos um MIDlet • JAR contém: Arquivos .class , arquivos de recursos (imagem .png, sons .midi, etc) e um manifest. • MIDLets numa mesma suite podem compartilhar classes, recursos contidos no JAR e memória persistent. • MIDlets de suites diferentes não podem interagir (MIDP 1 e 2) • JAD (Java Application Descriptor) • Pequeno arquivo texto que descreve uma Suite • Usado pela JAM para fazer verificações antes de baixar a Suite • Pode ser usado para guardar propriedades da aplicação • O par JAR/JAD representa o executável da aplicação MIDlet-1: AloMundo, , org.cesar.j2me.AloMIDlet MIDlet-Name: Alô Mundo! MIDlet-Vendor: C.E.S.A.R MIDlet-Version: 1.0 MIDlet-Jar-Size: 7808 MIDlet-Jar-URL: HelloExamples.jar
Passos para o desenvolvimento 1 2 3 4 5 6
Ambiente de Desenvolvimento • Editor texto + Sun Wireless Toolkit (WTK) (free) • http://java.sun.com/products/sjwtoolkit/ • NetBeans Mobility + WTK (free) • http://www.netbeans.org/products/mobility/ • Eclipse + EclipseME + WTK (free) • http://www.eclipse.org/downloads/index.php • http://eclipseme.org/docs/installation.html • SDK´s dos fabricantes (Nokia, Motorola, SonyEricsson, Siemens,…) • http://developer.motorola.com/docstools/sdks/ • http://forum.nokia.com/ • http://developer.sonyericsson.com/site/global/home/p_home.jsp • Borland JBuilder ($400 individual) • http://www.borland.com/us/products/jbuilder/index.html
Nosso ambiente... • Eclipse Europa (3.3) for Java Developers • Eclipseme plugin 1.7.6 • Sun Java Wireless Toolkit for CLDC (WTK) 2.5.2
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
Dica: Esteja com a API ao alcance... • http://java.sun.com/javame/reference/apis/jsr118/
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
Agora que vocês já estão craques… • Vamos ao nosso Jogo!!! • Etapas na concepção de um Jogo • Planejando um Jogo • Projetando um Jogo • Desenvolvendo um Jogo • Emulando um Jogo (testes) • Deploy do Jogo (testes reais) • Dicas de performance / Redução de código
Projeto Conceitual de Jogos Desenvolvendo Jogos em Java ME para celulares Aula 2Prática de jogos em Java ME Tarcisio Camara tarcisio.camara@meantime.com.br Geber Ramalho glr@cin.ufpe.br
Planejando um jogo • Fase de game design / concepção • Escolha do mercado • Escolha da categoria (Arcade, Puzzle, Ação, Esportes,RPG...) • Benchmark (atari, mega drive, nintendo 8 bits, etc) • Multiplayer / Singleplayer • Celulares foco • Características de um bom jogo wireless • Rápido e fácil de começar e de navegar (evitar uso de muitas softkeys e pressionamento de teclas). • Desafiador mas não impossível. • Jogos curtos ou com savegame • Sem muitas combinações de teclas e regras
Planejando um jogo (cont.) • Equipe • Entre 4 e 7 pessoas • Interdisciplinar: artitas gráficos, músicos, game designers, engenheiros de software, engenheiro de testes, etc… • Grana • Em torno de R$ 120.000 • Exigências do mercado (desafios extra) • Ciclo de desenvolvimento curto: 3 a 6 meses • Porte e localização • Otimização e qualidade • Distribuição • Portais de conteúdo • Escravos das operadoras • Número de dispositivos é barreira de entrada
Planejando um jogo (cont.) • Limitações: • Tamanho das telas • Memória heap • Número de cores • Som • Tamanho do JAR • Latência da rede • Custo final do jogo deve ficar entre R$ 5,00 e R$ 10,00 • Custo alto no uso da rede (~1 centavo por kbyte – R$ 1,00 a mais no custo de um jogo de 100 kb, só pra fazer o download)
Nosso Jogo! Analisamos tudo que foi falado e… Shot´em up game simplificadíiiiiiiiiissimo!! “ 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.”
Já Temos as Características... Work! • 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 (GameObject) • 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)
startApp() pauseApp() destroyApp() ShipMidlet Fire Constants Enemy ShipGameScreen ShipController GameObject Ship Sprite Projeto de classes <<extends>> MIDlet applySpeed() intersects() update() <<extends>> <<extends>> <<extends>> <<extends>> update() draw() CommandListener update() draw() * update() draw() Runnable <<implements>> * <<implements>> run() setPaused() setGameOver() commandAction() loadGameObjects() update() paint() keyPressed()
Antes de codificar, vamos ver… • Recursos de jogos do MIDP 2.0 • Fazer nosso GameObject herdar do Sprite de MIDP 2.0 • Usar colisão do sprite de MIDP2.0 • Usar GameCanvas • Usar tratamento de teclas usando getKeyStates() • Usar back buffer usando getGraphics() • Usar full screen • Adição de som (sugestão MIDI)
game lcdui * Layer LayerManager Displayable TiledLayer Sprite GameCanvas Canvas Pacote Jogos MIDP 2.0 • MIDP 2.0 Packages: • javax.microedition.lcdui.game • Vide API • http://java.sun.com/javame/reference/apis/jsr118/ GameObject
Sprite s.setFrameSequence(new int[]{0, 1, 2, … , 1, 1, 1, 1}); Sprite s = new Sprite(image, frameWidth, frameHeight); s.move(10, 0); s.nextFrame(); s.nextFrame();
Constants • Comandos do jogo • Características dos objetos • Declarar frame sequences (exercício) • Características do aparelho (largura e altura da tela) • Imagens usadas pelos objetos • Método para carregar as imagens (loadImages())
ShipMidlet • Possui referência para a tela principal do jogo • Possui referência para o controlador do jogo • Inicializa os objetos acima no startApp() • Inicializa o looping do jogo no controlador • Mostra a tela do jogo
ShipController • 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 pauseApp())
GameObject • Herda de javax.microedition.lcdui.game.Sprite • Posição x e y na tela • Altura e largura • Frame sequence para controlar as animações • Representação gráfica (método paint()) • Detecção de colisão • Estende com • Velocidades horizontal e vertical • Método abstrato update() • Responsabilidades das subclasses: Ship, Enemy e Fire • Inicializar frame sequences nos construtores e nas mudanças de estado das classes • Fazendo isso, não é necessário especializar o método paint(), ou seja, a lógica de renderização é reusada.
Ship • É um GameObject • Array de balas • Indicação se a nave está explodindo • Inicializar frame sequences nos construtores e nas mudanças de estado das classes • Métodos para mover a nave • Método pra disparar balas
Fire • É um GameObject • Tratamento ao sair da tela • Atualiza a posição, dada a velocidade
Enemy • É um GameObject • Possui um comportamento ingênuo (randômico) • Indicação se a nave está explodindo • Inicializa os frame sequences nos construtores e nas mudanças de estado das classes (exercício)
ShipGameScreen • Inicializa e possui todos os objetos do jogo (Nave, Inimigos e Balas) (exercício) • Centraliza a atualização dos estados dos objetos (exercício) • Controla colisão de balas com inimigos • 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)