Tutorial 4 - Hello update Loop

jMonkeyEngine 3 Tutorial (4) - Hello Update Loop

Anterior: Hello Assets, Próximo: Hello Input System

Agora que você sabe como carregar ativos, como modelos 3D, você quer implementar alguma jogabilidade que usa estes ativos. Neste tutorial nós olhamos no loop de atualização. O loop de atualização de seu jogo é onde a ação acontece.

Amostra de Código

package jme3test.helloworld;

import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;

/** Sample 4 - how to trigger repeating actions from the main update loop.
 * In this example, we make the player character rotate. */
public class HelloLoop extends SimpleApplication {

    public static void main(String[] args){
        HelloLoop app = new HelloLoop();
        app.start();
    }

    protected Geometry player;

    @Override
    public void simpleInitApp() {

        Box b = new Box(Vector3f.ZERO, 1, 1, 1);
        player = new Geometry("blue cube", b);
        Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        player.setMaterial(mat);
        rootNode.attachChild(player);
    }

    /* This is the update loop */
    @Override
    public void simpleUpdate(float tpf) {
        // make the player rotate
        player.rotate(0, 2*tpf, 0); 
    }
}

Compile e execute o arquivo: Você vê um cubo rotacionando constantemente.

Entendendo o Código

Comparado a nossos exemplos de código anteriores você nota que a geometria (Geometry) do jogador é agora um campo (atributo) de classe. Isto é porque nós queremos que o loop de atualização seja capaz de acessar e transformar esta geometria (Geometry). Como notmal, nós inicializamos o objeto jogador no método simpleInitApp().

Agora dê uma olhada mais de perto no método simpleUpdate() – este é o loop de atualização.

  • A linha player.rotate(0, 2*tpf, 0); muda a rotação do objeto jogador.
  • Nós usamos a variável tpf (tempo por quadro) ("time per frame") para temporizar esta ação dependendo da taxa atual de quadros por segundo. Isto simplesmente significa que o cubo rotaciona com a mesma velocidade em máquinas rápidas e lentas, e o jogo permanece jogável.
  • Quando o jogo executa, o código rotate() é executado repetidamente.

Usando o Loop de Atualização

Um objeto rotacionando é apenas um exemplo simples. No loop de atualização, você tipicamente tem muitos testes e dispara várias ações de jogo. Isto é onde você atualiza a pontuação e pontos de vida, checa por colisões, faz os inimigos calcularem o próximo movimento deles, rola os dados se uma armadilha foi colocada, toca sons ambiente aleatórios, e muito mais.

  • O método simpleUpdate() inicia sua execução após o método simpleInitApp() ter inicializado o grafo de cena e as variáveis de estado.
  • JME3 executa tudo no método simpleUpdate() repetidamente, tão rápido quanto possível.
  • Use o loop para consultar o estado do jogo e então inciar ações.
  • Use o loop para disparar reações e atualizar o estado do jogo.
  • Use o loop com sabedoria, por que ter chamadas demais no loop também faz o jogo mais executar mais lento.

Inicializar - Atualizar - Renderizar

Note o contraste:

  • O método simpleInitApp() é executado somente uma vez, imediatamente no início;
  • O método simpleUpdate() executa repetidamente, durante o jogo.
  • Depois de toda atualização a jMonkeyEngine automaticamente redesenha (renderiza) a tela para você!

Desde que rendering é automático e, inicialização e a atualiação são os dois conceitos mais importantes em uma SimpleApplication para você imediatamente. Estes métodos são onde você carrega e cria dados do jogo (uma vez), e (repetidamente) muda as propriedades deles para atualizar o estado do jogo:

  • simpleInitApp() é a "primeira respiração" da aplicação.
  • simpleUpdate() é a batida de coração da aplicação.
  • A unidade de tempo de atualização é chamada tiques (ticks).

Tudo em um jogo acontece ou durante a inicialização ou durante o loop de atualização. Isto significa que estes dois métodos crescem muito com o tempo. Há duas estratégias como desenvolvedores experientes espalham o código de atualização e inicialização em várias classes Java:

  1. Mova os blocos de código do método simpleInitApp() para AppStates.
  2. Mova os blocos de código do método simpleUpdate() para Custom Controls.

mantenha isto em mente pata depois quando sua aplicação crescer.

Exercícios

Aqui estão algumas coisas divertidas para experimentar:

  • O que acontece se você dar ao método rotate() números negativos?
  • Você pode criar duas geometrias (Geometries) uma próxima a outra, e fazer uma rotacionar duas vezes mais rápido que a outra? (use a varuável tpf)
  • Você pode fazer um cubo que pulsa (cresce e diminui)
  • Você pode fazer um cubo que muda de cor? (mude e configure o Material)
  • Você pode fazer um cubo que role (rotacione ao redor do eixo x, e translade ao longo do eixo z)

Olhe de volta no tutorial Hello Node se você não lembra os métodos de transformação para escalonar, transladar, e rotacionar.

Link para soluções propostas pelos usuário: http://jmonkeyengine.org/wiki/doku.php/jm3:solutions Esteja certo de tentar resolvê-las por si só primeiro!

Conclusão

Agora você está ouvindo ao loop de atualização, "a batida do coração" do jogo, e você pode adicionar todos os tipos de ação a ele.

A próxima coisa que o jogo precisa é alguma interação! Continue aprendendo a como responder a entrada do usuário.

Veja também:

Desenvolvedores jME3 avançados usam Estados da Aplicação (Application States) e Controles Personalizados (Custom Controls) para implementar mecânicas de jogo no loop de atualização deles. Você topará nestes tópicos de novo mais tarde quando você proceder para documentação mais avançada.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.