Projeto Conceitual de Jogos
Desenvolvendo Jogos
em Java ME para celulares
Aula 1
Introdução à Java ME
Tarcisio Camara
[email protected]
Geber Ramalho
[email protected]
Novembro, 2007
1
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
Novembro, 2007
2
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
Novembro, 2007
3
Mercado: Cadeia de Valor
Fluxo de produção >>>
Brands
Developer Publisher
Technology
Mobile
Portal
Carrier
End-user
<<< Fluxo de receita (R$)

Ciclo de desenvolvimento deve ser rápido (<6 meses)

Retorno do investimento lento
Novembro, 2007
4
Mercado: Visão geral

Principais Players: EA Mobile (Jamdat), Gameloft (Ubi
Software), Glu Mobile, Digital Chocolate, Hands On e IPlay.
– 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
Novembro, 2007
5
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
Novembro, 2007
6
Telefones Java (>650 dispositivos)
http://developers.sun.com/techtopics/mobility/device/pub/device/list.do
20 dispositivos
por página
Novembro, 2007
7
Introdução a plataforma J2ME
SERVIDOR
DESKTOP
CELULARES
Novembro, 2007
SMARTCARDS
8
Arquitetura Java ME
Application
Profiles
Configuration:
Libraries
KVM
Host Operating System
Device Hardware
Novembro, 2007
9
Universo Java ME Hoje…


Java Community Process (JCP)
Java Specification Request (JSR)
http://java.sun.com/javame/technology/jcp.jsp
Novembro, 2007
10
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
Novembro, 2007
11
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.
Novembro, 2007
12
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…)
Novembro, 2007
13
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
Novembro, 2007
14
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
Novembro, 2007
15
Pacotes do CLDC

Herdados do J2SE

Específicos do CLDC
– java.lang
– java.io
– java.util
– javax.microedition.io
Novembro, 2007
16
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
MIDP
MIDP
MIDP
Novembro, 2007
1.0
2.0
2.1
3.0 (em breve)
17
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
Memória não volátil
Memória volátil
Tela
Entrada
Conectividade
Som
Novembro, 2007
MIDP 1.0
MIDP 2.0
128 Kb
256 Kb
32 Kb
128 Kb
96x54 - 2 cores
Teclado e/ou touch screen
HTTP 1.1
Não exigido
Tons, WAV, MIDI
18
Pacotes do MIDP 1.0
MIDP Packages:
–javax.microedition.midlet

javax.microedition.midlet.MIDlet
–javax.microedition.lcdui
–javax.microedition.rms
javax.microedition.rms.RecordStore
Novembro, 2007
19
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
game
lcdui
Layer *
TiledLayer
Sprite
LayerManager
Displayable
GameCanvas
Canvas
–javax.microedition.io
javax.microedition.io.PushRegistry
Novembro, 2007
20
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).
Novembro, 2007
21
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
Novembro, 2007
22
Ciclo de vida dos MIDlets
Novembro, 2007
23
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
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

O par JAR/JAD representa o executável da aplicação
Novembro, 2007
24
Passos para o desenvolvimento
Novembro, 2007
1
2
3
4
5
6
25
Ambiente de Desenvolvimento

Editor texto + Sun Wireless Toolkit (WTK) (free)

NetBeans Mobility + WTK (free)

Eclipse + EclipseME + WTK (free)

SDK´s dos fabricantes (Nokia, Motorola,
SonyEricsson, Siemens,…)
– http://java.sun.com/products/sjwtoolkit/
– http://www.netbeans.org/products/mobility/
– http://www.eclipse.org/downloads/index.php
– http://eclipseme.org/docs/installation.html
– 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
Novembro, 2007
26
Nosso ambiente...

Eclipse Europa (3.3) for Java Developers

Eclipseme plugin 1.7.6

Sun Java Wireless Toolkit for CLDC (WTK) 2.5.2
Novembro, 2007
27
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
Novembro, 2007
28
Dica: Esteja com a API ao alcance...

http://java.sun.com/javame/reference/apis/jsr118/
Novembro, 2007
29
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
Novembro, 2007
30
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
Novembro, 2007
31
Projeto Conceitual de Jogos
Desenvolvendo Jogos
em Java ME para celulares
Aula 2
Prática de jogos em
Java ME
Tarcisio Camara
[email protected]
Geber Ramalho
[email protected]
Novembro, 2007
32
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
Novembro, 2007
33
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
Novembro, 2007
34
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)
Novembro, 2007
35
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.”

Novembro, 2007
36
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)
Novembro, 2007
37
Sprite
Projeto de classes
<<extends>>
GameObject
MIDlet
<<extends>>
<<extends>>
CommandListener
Enemy
ShipMidlet
startApp()
pauseApp()
destroyApp()
update()
draw()
applySpeed()
intersects()
update()
<<extends>>
<<extends>>
Ship
update()
draw()
Fire
*
Runnable
update()
draw()
<<implements>>
*
<<implements>>
ShipController
ShipGameScreen
run()
setPaused()
setGameOver()
commandAction()
loadGameObjects()
update()
paint()
keyPressed()
Novembro, 2007
Constants
38
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)
Novembro, 2007
39
Pacote Jogos MIDP 2.0
MIDP 2.0 Packages:

– javax.microedition.lcdui.game
game
lcdui
Layer *
TiledLayer
Sprite
LayerManager
Displayable
GameCanvas
Canvas
GameObject
– Vide API
 http://java.sun.com/javame/reference/apis/jsr118/
Novembro, 2007
40
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();
Novembro, 2007
41
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())



Novembro, 2007
42
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
Novembro, 2007
43
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())
Novembro, 2007
44
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.
Novembro, 2007
45
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
Novembro, 2007
46
Fire



É um GameObject
Tratamento ao sair da tela
Atualiza a posição, dada a velocidade
Novembro, 2007
47
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)
Novembro, 2007
48
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)
Novembro, 2007
49
BUILD & RUN!
Novembro, 2007
50
Deploy



“Over the Air” (OTA)
Cabo serial
Infra vermelho
MIDLet
server
descoberta
JAR
remoção
jad
Atualização
instalação
jad’
JAR
checagem
confirmação
Novembro, 2007
execução
51
Melhorias










Adição de splash screen
Adição de menu
Melhorar tela de game over
Tabela com recordes (RMS)
Background com scrolling
Chefe de fase
Coleta de itens (campo de força, diferentes tiros, etc)
Tipos diferentes de inimigos
I.A dos inimigos
Upload de pontuação
Novembro, 2007
52
Melhorias no uso de MIDP 2.0

Outros recursos de jogos do MIDP 2.0
– Usar GameCanvas
 Usar tratamento de teclas usando getKeyStates()
 Usar back buffer usando getGraphics()
 Usar full screen
– Adição de som (sugestão MIDI)
Novembro, 2007
53
Otimize, se necessário

Obfuscadores para diminuir tamanho de código
– Proguard, Retroguard, etc.







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
Novembro, 2007
54
Otimização (cont.)

Combine várias imagens em uma só
1 PNG
0.7k
4 PNG
1.6k



Número de cores das imagens
Uso do Clip pra pintura
Preocupações
– Tamanho do Jar (64k ~ 150k)
– Memória (200k ~ 1 Mb)
– Processamento (5 fps ~ 12 fps)
Novembro, 2007
55
Um pouco mais sobre porte



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 API (MIDP 1.0 ou 2.0, etc)
– Bugs do celular
– Vários idiomas
– Funcionalidades do jogo
– etc…
Escala
– Chega-se a gerar +2000 versões de uma aplicação
Novembro, 2007
56
Boas práticas para o porte

Manter código único
– Pré-processamento //#ifdef <symbol>
 http://antenna.sourceforge.net/
 http://eclipseme.org/index.html
– Aspectos
 Pesquisa acadêmica

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/
Novembro, 2007
57
Dicas finais

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
Listas de discussão
– kvm-interest
– j2me-brasil
Novembro, 2007
58
Obrigado!
Dúvidas, questionamentos ou aflições...
[email protected]
Novembro, 2007
59
Download

GAMES_J2ME