Jogos em JME (ou como transformar seu telefone em um console de vídeo mini-jogo)

17 junho de 2010 por Enrique Deixe uma resposta »

Com o poder de processamento com dispositivos móveis de hoje e, em especial telefones celulares, é possível com um pouco de esforço, paciência e ansioso de implementar jogos interessantes em Java para telefones celulares.

A "célula" de hoje é como um computador com lotes de periféricos integrados, incluindo uma câmera, teclado, tela, telefone celular, um leitor de cartão de memória externa, wi-fi, GPS, GSM, etc E tudo isso na palma da sua mão.

Alguns destes dispositivos móveis trazem sistemas operacionais proprietários, outros usam alguma versão do Windows, Linux ou OS Symbian. Mas há uma característica que mais têm em comum: Java. Obviamente não a versão de pleno poder de Java que está instalado no nosso desktop, laptop ou servidor. Esta é uma versão adaptada para dispositivos móveis em os quais não existe gigabyte de memória RAM, ou CPUs múltiplo com freqüências de clock da ordem dos Giga Hetrz.

Surpreendentemente, Java Micro Edition (JME, AKA J2ME) tem as características que o tornam uma plataforma muito interessante para desenvolver aplicativos e especialmente jogos. E o último é o que vamos explorar.


Primeira teoria um pouco

Dado o número de dispositivos móveis, todos com características diferentes foram inventadas de "perfis de competências" para MIDP Mobile Information Device Profile. Dependendo da versão do MIDP, o dispositivo terá competências mais ou menos: comunicação, apresentação de áudio, etc.

Além MIDP, há outra especificação chamada de Device Configuration CLDC Connected Limited, que define baixo nível capacidades do dispositivo, por exemplo, se você tem a habilidade para lidar com número de ponto flutuante.

É baseada em CLDC MIDP para formar a plataforma Java ME. A idéia é para desenvolver sobre a plataforma mais compatível quanto possível. Hoje, a maioria dos telefones suportam MIDP 2.0 e CLDC 1.1, mas se nos limitarmos a CLDC 1.0 melhor. A Motorola V360 é um exemplo de telefone celular com MIDP 2.0 e 1.0 CLDC.

Então, quando começamos a desenvolver, temos de escolher qual a versão do MIDP e CLDC vai usar. No Oracle (http://java.sun.com/javame/technology/index.jsp), você pode encontrar mais informações eo SDK (http://java.sun.com/javame/downloads/index. jsp).

Bem, temos o SDK instalado, temos a nossa confiança IDE configurado. Agora o quê? Para agendar! Bem, não tão rápido. Como você programar um jogo? Isto é algo que temos vindo a fazê-lo desde anos atrás, não temos muito claro. A Internet é uma grande quantidade de documentação, mas o bom mesmo é escasso.

Primeiro de tudo, vamos ver é o esqueleto de um jogo de pseudo-in:

  processo de entrada do usuário
 atualizar o estado do jogo
 desenho na tela
 Ir para 1

Santo padroeiro de computadores, desculpa para o goto.

Não há nada revelando nestas 4 linhas, mas o que se pode começar a ver alguns problemas. Por exemplo, este jogo vai correr a velocidades diferentes, dependendo da potência da célula. Algo que não é claramente desejável. Obviamente, queremos que o nosso jogo para trabalhar na mesma velocidade em qualquer telefone, independentemente de sua potência.

Para isso, vamos fazer uma pequena alteração:

  processo de entrada do usuário
 atualizar o estado do jogo
 desenho na tela
 esperar milissegundos X
 Ir para 1

    Agora variando X, nós pode variar a velocidade do jogo. Fácil ... certo? Repousa com o usuário para escolher X através de, por exemplo, o menu do jogo o. Mas X não pôde ser determinado automaticamente? Melhor ainda, como X não pôde ser determinado dinamicamente em cada volta do ciclo? Claro. Agora vejamos:

      ciclos_por_segundo = 30
     milisegundos_por_ciclo = 1000 / ciclos_por_segundo
     t_inicial = now ()
     processo de entrada do usuário
     atualizar o estado do jogo
     desenho na tela
     t_ciclo = now () - t_inicial
     if (t_ciclo <milisegundos_por_ciclo), em seguida,
         esperar (milisegundos_por_ciclo - t_ciclo) milissegundos
     Ir à 3
    

    Nota: A função now () retorna o tempo atual em milissegundos, tornando-se algo como System.currentTimeMillis () em Java.

    O que você é, tomar o tempo que leva um ciclo completo (4, 5 e 6). Se que o tempo é menos do que a quantidade de tempo que nós estabelecido, para cada ciclo em 1 e 2, em seguida, nós esperamos que de que a diferença de tempo. Assim, todos os ciclos de o mesmo atraso eo tempo de espera é dinamicamente ajustada.

    Desta forma, executar, bem como entre o poder célula diferente. Este método pode ser melhorado através da implementação de quebras de ciclos (quadro pular) quando a célula é muito baixa potência, mas corremos o risco de que o jogo torna-se impossível de jogar. Assim, o jogo ficar mais lento em baixa potência da célula, e que todo o tempo será consumido nos parágrafos 4, 5 e 6 e nunca entrar em standby.

    É incrível quantas coisas interessantes que pode ser feito usando esta técnica simples.

    Uma prática

    Vamos implementar esta técnica, o "Olá mundo" dos jogos: PONG um por um.

    Pong

    Pong

    É como um Arkanoid, mas sem os tijolos. Verdadeira diversão, não muito.

    A implementação Java do loop principal se parece com:

      CICLOS_POR_SEGUNDO final int = 30;
     MILISEGUNDOS_POR_CICLO final int = 1000 / CICLOS_POR_SEGUNDO;
     while (true) {
         longo tInicial = System.currentTimeMillis ();
         procesarEntradaDelUsuario ();
         actualizarEstadoDelJuego ();
         dibujarLaPantalla ();
         longo tcycle = System.currentTimeMillis () - tInicial;
         if (tcycle <MILISEGUNDOS_POR_CICLO) {
             Thread.sleep (MILISEGUNDOS_POR_CICLO - tcycle);
         }
     }
    

    Note que nada até agora tem sido feito particularmente para o PONG. Ele irá ser funções particularmente procesarEntradaDelUsuario (), actualizarEstadoDelJuego () e dibujarLaPantalla ().

    O primeiro é responsável por tomar algo entrada do usuário e mudança no jogo, neste caso seria a posição da paleta. Sim, a paleta é o retângulo verde .. deve ter imaginação :-)

    O segundo deve atualizar o estado interno do jogo. Neste jogo, esta função tem dois objetivos: a) passar a bola e b) se a bola vai para baixo, então o jogo termina com o fatídico "Game Over".

    O recurso de terceiro e último, você deve levar o estado do jogo e desenhar na tela.

    O código fonte pode ser baixado aqui: -pong scr.tar . Nesta implementação, nunca se perde. Quando a bola vai para baixo, aparece novamente no meio da tela. Um bom exercício seria adicionar vidas, para aumentar a velocidade da bola, dando aceleração para a paleta, melhorar gráficos, acrescentar tijolos, sons, para citar powerups e comerciante (não Arkanoid, claro :) ) E então, a fama!

    Divirta-se!

    Blogger Mensagem Digg Reddit Google Reader Ação
    Anúncio

    Deixe um comentário

    Spam protecção por WP de Captcha-Livre