jump to navigation

jMonkey Básico: a classe SimpleGame 15/11/2008

Posted by Leandro Nunes in Java, Jogos, NetBeans, Programação Geral.
Tags: , , , , ,
2 comments

Prosseguindo com a série de artigos sobre jMonkey, que já conta com dois posts no blog passamos agora para um exemplo básico programa desenvolvido com jMonkey para testar algumas de suas funcionalidades.

Não deixe de ler:

2784150

Para fins deste tutorial, considera-se que você tenha um ambiente jMonkey configurado e funcionando, não importando que IDE você utiliza nem Sistema operacional.

Nosso objetivo para este tutorial é entender um pouco mais sobre:

  • Fluxo de um game genérico utilizando jMonkey e
  • Funcionamento da classe SimpleGame.

Dependendo da classe GameType utilizada (SimpleGame é uma delas), o nível de abstração de seu game será maior (onde a jMonkey Engine oferece mais recursos ao desenvolvedor) ou menor (deixando livre para o desenvolvedor fazer as escolhas de como as coisas vão ser implementadas).

Um conceito importante a ser entendido neste momento é o conceito de “Game Loop”:

game-loop1Game Loop, é o fluxo de execução de um game que,  na abordagem da jMonkey consiste em sete passos principais: Inicialização do sistema; Inicialização do game; Início do loop; Atualização dos dados do game; renderização dos dados atualizados; Verificação do estado atual do game e Finalização. A figura ao lado ilustra esse fluxo, clique para ampliar.

A jMonkey Engine oferece um conjunto de classes que implementa esse GameLoop. (BaseGame, SimpleGame, StandardGame, SimplePassGame, BaseHeadlessApp, entre muitas outras…) Neste tutorial, pretendo detalhar o funcionamento de uma dessas classes, a SimpleGame.

SimpleGame

A classe SimpleGame oferece um cenário de desenvolvimento de games bem completo para o desenvolvedor, descomplicando o processo de criação de games.

Vale lembrar que na jMonkey Engine, todas as cenas são baseadas em um grafo de objetos que é renderizado. Utilizando SimpleGame, a jMonkey Engine fornece inclusive o nodo raiz, no qual o desenvolvedor deverá anexar seus objetos (esse nodo pode ser acessado através de um objeto chamado rootNode).

Um esqueleto básico de programa (vazio) que demonstra SimpleGame é mostrado abaixo.

import com.jme.app.SimpleGame;
public class SimpleGameSample extends SimpleGame {

    protected void simpleInitGame() { }

    @Override
    protected void simpleUpdate() {   }

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

Bem, se você testou esse programa, já foi possível ver uma magnífica…. tela vazia… vamos detalhar agora os recurso que são fornecidos nessa tela. Para isso, temos que desenhar alguma coisa nela. Que tal uma seta ? pra começar tá legal.

import com.jme.app.SimpleGame;
import com.jme.scene.shape.Arrow;
public class SimpleGameSample extends SimpleGame {
    Arrow a;
    protected void simpleInitGame() {
        a = new Arrow("Arrow",10,5);
        rootNode.attachChild(a);
    }

    @Override
    protected void simpleUpdate() {
    }

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

simplegamescreenshotOs recursos fornecidos pela SimpleGame são:

  • Acesso ao InputHandler (manipulador de entradas) para tratamento de teclado e mouse;

atalhos-jmonkey

  • Uma Câmera posicionada na coordenada (0,0,25) apontada (significa que ela está “olhando”) para (0,0,-1) e que pode ser acessada pelo objeto chamado “cam”;
  • Um ponto de luz branca posicionado em (100,100,100) e já adicionado ao nodo raiz. Essa luz por ser desabilitada pelo atalho “L” ou por uma chama (em código) do método lightState.setEnabled(false);
  • Um timer, criado e gerenciado pela infra-estrutura para controlar tempo gasto para renderização dos frames que é sempre mostrado no rodapé quando se está utilizando SimpleGame;
  • Por último o objeto rootNode, já citado, que é o nodo raiz, que é o ponto inicial onde o renderizado procurar “coisas que devem ser desenhadas”. À este nodo, os objetos padrão do game são anexados.

Métodos:

  • simpleInitGame(): único método que obrigatóriamente deve ser implementado quando se utiliza SimpleGame. É neste método é que os objetos da cena deve ser criados;
  • simpleUpdate(): é o método chamado a cada atualização da tela. Neste método que são implementadas as mudanças de estado do game, bem como detecção de colisão e movimentação dos componentes da cena;
  • simpleRender(): esse método é chamado como último passo antes do renderizador finalizar uma cena. É o lugar onde são colocadas as renderizações de textura e os objetos que devem ser desenhados mas não estão anexados ao rootNode.

No próximo tutorial irei abordar os assuntos: “Formas Básicas” e “Texturas”. Até lá!

Entendendo a JMonkey Engine 20/09/2008

Posted by Leandro Nunes in Java, Jogos.
Tags: , , , , , , ,
2 comments

JMonkey Engine (jME) é um framework Open Source de alta performance para desenvolvimento de aplicações Java que utilzem recursos 3D. A primeira versão do framework foi criada por Mark Powell em 2003, enquanto pesquisava sobre o processo renderização utilizado em OpenGL.

A arquitetura do framework é baseada em grafos de cenas, ou seja, os dados do ambiente estão organizados em uma estrutura de árvore, onde um nodo origem pode ter um conjunto de nodos filhos. Estes nodos filhos, por sua vez, têm uma referência única de seu nodo de origem (também chamado nodo pai). Toda essa estrutura tem o objetivo de tornar o processo de renderização mais ágil.

Por exemplo, se construírmos um grafo de cena que representa um conjunto de móveis, que estão relacionados através de seu nodo pai, que é a sala, que por sua vez compartilham um andar, que estão localizados em um determinado edifício.

Se neste ambiente hierárquico bem definido, estivermos interessados em mostrar apenas um determinado andar, podemos facilmente descartar do processo de renderização todos os ramos do grafo que representam os outros andares, e por consequência, suas salas e seus móveis mostrando apenas o que realmente deve ser mostrado.

O segredo para poupar recursos preciosos do sistema tornando esse sistema de renderização realmente eficiente está em um bom algoritmo para o sistema de câmeras. A câmera é o objeto que aponta, em um determinado ambiente 3D, para onde estamos focalizando (olhando) num determinado momento. Ela que decide quem deverá ser desenhado ou não, num determinado instante de tempo.

Esse vídeo, apresentado durante a JavaOne 2008 apresenta algumas demonstrações feitas com JMonkey. Acredito que para quem está começando, o vídeo dá uma boa idéia do que pode ser feito com esse framework.

Nos próximo artigos sobre JMonkey, mostrarei como configurar o ambiente de desenvolvimento com JMonkey e LWJGL, demonstrações de programas para criação de formas simples, manipulação de câmera e um código base para desenvolvimento de aplicações com o framework.

Enquanto preparo esse material, fiquem com esse outro vídeo de um dos atuais líderes do projeto JMonkey, Josh Slack, falando sobre o projeto.

tem também o site oficial… http://www.jmonkeyengine.com

Enjoy!