# J2ME/Lições/GameCanvas

O Canvas foi uma classe criada para o tratamentos de eventos de baixo nível, que durande o Midp1.0 foi muito usada na produção de jogos, a partir da versão Midp2.0, o J2ME apresentou uma nova classe, a GameCanvas com ações mais voltadas para a manipulação de jogos.

## Iniciando um GameCanvas

Primeiramente vamos importar o pacote que contém a classe GameCanvas.
Agora vamos criar a classe MeuGameCanvas, estendendo a classe GameCanvas.
Uma classe que extende o GameCanvas precisa obrigatoriamente de um construtor.
Agora precisamos obrigatoriamente instanciar a classe superior GameCanvas dentro do construtor, usaremos o argumento true (se quisermos herdar os métodos da classe Canvas) ou false (se quisermos usar apenas os métodos da classe GameCanvas.

## Utilizando Canvas no GameCanvas

Do mesmo modo que a classe Canvas, na classe GameCanvas podemos usar o método paint (que na GameCanvas é public) para exibir algo na tela. Vamos primeiramente inserir o pacote que contém a classe Canvas.
Agora vamos criar o método paint.
Agora vamos desenhar um retângulo na tela.
Também podemos implementar outros métodos da classe Canvas como o keyPressed (como public).

## Estrutura básica do GameCanvas

Vimos que podemos fazer tudo que fazíamos no Canvas dentro do GameCanvas, mas vamos ver agora que o GameCanvas não trabalha somente "reinventando a roda", ele possui um tratamento diferente que se assemelha mais as várias APIs de criação de jogos que existem por ai, não vamos trabalhar com um método padrão, e sim com loops que irão fixar a tela, até quando uma condição faça com que o loop pare.
Bom, primeiramente agora que não temos mais o método paint que era inicializado automaticamente, vamos agora usar outro método que também é chamado automaticamente, ele está dentro da interface Runnable, vamos implementar na classe.
Agora devemos obrigatoriamente incluir dentro da nossa classe o método run da interface Runnable que é o método que é chamado automaticamente, será dentro dele que iremos incluir todas as ações da classe.
Agora vamos instanciar um objeto da classe Thread, ele será o controlador que irá iniciar a nossa classe.
Devemos agora iniciar o objeto thread dentro do construtor da classe, como parâmetro vamos usar o this da classe GameCanvas.
Já temos tudo pronto, agora por último vamos iniciar a o objeto Thread que criamos utilizando o método start dentro do construtor.

## Exibindo algo no GameCanvas

Agora com a estrutura básica do nosso GameCanvas pronta, precisamos criar um objeto do tipo Graphics dentro da nossa classe GameCanvas.
Agora dentro criaremos o loop principal dentro do método run, primeiramente vamos criar uma variavel booleana, para criar a condição do jogo.
Agora vamos criar o loop com um comando while que irá comparar a variavel booleana que criamos.
Por fim dentro do loop vamos chamar o método flushGraphics que irá desenhar o gráfico na tela do celular.
Agora como exemplo vamos exibir um retângulo na tela através do objeto do tipo Graphics.

## Controlando a velocidade do aplicativo

Agora que fizemos a exibição precisamos controlar a velocidade de atualização do loop, isso porque do jeito que está o aplicativo irá rodar mais rápido em celulares com melhor hardware e mais lentos em celulares com pior hardware.
Para isso primeiramente precisamos criar um try-catch-finally dentro do loop principal.
Agora, como devemos sempre pintar a tela a cada loop colocamos o flushGraphics dentro do finally.
Agora dentro do try vamos utilizar o método sleep da classe Thread e entrar como parâmetro o tempo em milisegundos que a aplicação deve esperar para chamar o próximo loop, nesse caso iremos esperar 50 milisegundos (o que dá 20 quadros por segundo) que é mais ou menos a taxa de atualização da tela da maioria dos celulares.
Agora por último colocaremos um simples retângulo para andar na tela, para isso criaremos uma variável int auxiliar que irá encrementar-se a cada loop, e depois usaremos essa variável em um parâmetro do método drawRect.
Você pode mudar a taxa de atualização na tela (método sleep) e verá que o retângulo irá se mover com diferentes velocidades.

## Controles no GameCanvas

No Canvas tratávamos separadamente a parte dos comandos e a parte dos gráfico, agora no GameCanvas podemos tratar dessas coisas tudo no mesmo loop, vamos ver agora que essa parte será tratada de uma forma bem diferente e muito mais simples.
Primeiramente dentro do run vamos criar uma variável que tem que ser do tipo int que irá receber os controles.
Agora dentro do loop principal vamos checar se alguma tecla foi pressionada através do método getKeyStates.
Agora vamos criar uma condição caso uma tecla específica seja apertada, nesse caso vamos usar a tecla FIRE e desenhar outro retângulo na tela caso ela seja apertada, note que agora vamos usar a constante FIRE_PRESSED.

## Imagens no GameCanvas

Vamos agora ver como carregar uma imagem no GameCanvas, isso pode se aplicar ao carregamento de outros arquivos também.
Primeiramente dentro do método run vamos colocar um try-catch.
Agora dentro do vamos instanciar o objeto Image na classe MeuGameCanvas.
Depois vamos iniciar o objeto Image dentro do try no método run.
Agora normalmente dentro do loop do jogo colocamos a imagem para ser exibida.