Ponto V!

Home Java Informações gerais Escolhendo onde desenhar
Vinícius Godoy de Mendonça
Escolhendo onde desenharImprimir
Escrito por Vinícius Godoy de Mendonça

O primeiro passo para qualquer jogo é abrir uma janela, ou criar algum local onde ele possa ser desenhado. O Java permite a criação de dois tipos de áreas: janelas e Applets, ambas presentes em dois tipos de bibliotecas a antiga e obsoleta AWT, e o Swing.

Nesse artigo, vamos explorar essas duas opções, e comentar sobre as vantagens e desvantagens de cada uma. Não entraremos em detalhes de código, mas já seremos capazes de escolher qual das duas tecnologias usar.

AWT ou Swing?

A resposta dessa pergunta é bastante direta: Use Swing. A AWT está obsoleta e, a menos que você queria programar em Java 1.1, só para ser compatível com o browser da MS, não há porque usar AWT. Ela é mais lenta e menos estável que o Swing, não implementa double buffering por padrão e é desprovida de vários recursos.

Isso não vale só para jogos. Se na sua vida profissional ou acadêmica você for estudar um ambiente de janelas, não use a AWT. Até por isso, não falarei de Applets ou Janelas AWT nesse artigo.

Applets

Applet é um aplicativo que pode ser embarcado numa página HTML, assim como uma imagem poderia. Quando você usa um applet numa página, ele é baixado para o aplicativo do cliente e a virtual machine do browser local dispara sua execução.

Quando uma página é aberta, o Java Plug-In inicia o JRE. Normalmente, todos os applets serão atendidos pelo mesmo JRE, em threads distintas, a menos que seja diretamente especificado o contrário, ou que o applet requisite parâmetros especiais de execução da VM (como um tamanho de heap diferenciado, por exemplo).

O Java Plugin-In inicia então a execução do applet. A execução completa do applet sempre obecerá um ciclo de vida bem definido: o applet inicia, começa a rodar, executa, para de rodar e faz uma limpeza final. Applets tem métodos especiais, para cada um desses pontos:

O método init(), que é útil para inicializações feitas uma vez só, mas que não demorem muito tempo. Como o construtor do Applet não pode garantir que o ambiente onde o applet roda esteja gerado, geralmente colocamos o código de construção de um applet nesse método.

O método start(), que é disparado sempre que o applet se torna ativo. Geralmente é uma boa prática manter a execução desse método rápida.

O método stop(). Geralmente, os applets que sobrescrevem start() também deverão sobrescrever stop(). Esse método é executado sempre que seu applet é parado, como no caso do usuário navegar para fora da janela do browser(). Você pode usar esse método para, por exemplo, pausar o jogo.

Finalmente, o método destroy(), usado para finalizar o Applet.

Por questões de segurança, applets executam num ambiente chamado sandbox. Esse ambiente impõe ao aos Applet uma série de restrições:

  • Eles não podem carregar bibliotecas nativas ou criar novos ClassLoaders;
  • Ele não pode trocar de SecurityManager;
  • E não podem ler todas as propriedades do sistema.
  • Ele não pode acessar recursos locais do cliente, como sistema de arquivos, executáveis, área de transferência ou impressoras;

Agora, isso não torna o applet totalmente desprovido de funcionalidade. Eles ainda podem comunicar-se via rede com o host de onde vieram, manipular HTML, invocar métodos públicos de outros applets.

Todas essas restrições podem ser removidas se o cliente assinar o applet. Ou seja, se seu usuário der permissões explícitas de execução. Assim, é possível fazer um applet que rode usando a JOGL e acesse bibliotecas gráficas da máquina local.

Janelas

Outra possibilidade é deixar o browser de lado e criar uma janela. Existem várias vantagens nessa abordagem:

  • Não existem as restrições dos applets;
  • É possível disparar a janela em tela cheia, usando o modo gráfico acelerado (FSEM);
  • É possível alterar a resolução da máquina cliente.
  • É mais imersivo que um applet.

Sempre que trabalharmos com janelas, teremos duas possibilidades onde fazer o desenho. A primeira delas é desenhar diretamente na janela, através de um método de pintura. Essa é a abordagem mais vantajosa para jogos, já que ela permite um controle bastante refinado sobre o ciclo de pintura, como veremos em artigos futuros. Esse método de pintura pode ser o padrão paint() ou um personalizado.

Outra possibilidade é não escrever diretamente na janela, mas criar um componente. A pintura é feita sobrescrevendo o método paintComponent(). Como não é possível controlar exatamente as pinturas, essa abordagem é mais recomendada para jogos mais estáticos, como os de tabuleiro. A vantagem dela é que é muito fácil migrar esse componente depois para um applet, e fornecer seu jogo em ambas opções. Pintar sobre um componente também é uma boa idéia se você estiver fazendo aplicações de suporte para seu jogo, como editores de mapas, já que o componente pode ocupar apenas uma porção da tela, e dividir o espaço com botões e barras de ferramentas.

Por padrão, o Swing dá suporte completo as técnicas de double buffering e page flipping. Por isso, você dificilmente verá janelas piscando ou efeitos estranhos.

A desvantagem de se trabalhar com janelas é que muitos usuários podem desconfiar da operação de baixar uma aplicação e executá-la. Por isso, pense três ou quatro vezes, caso seu público seja o de jogadores casuais.

Conclusões

Neste artigo vimos as principais diferenças entre applets e janelas. Vimos que applets devem ser usados para jogos que rodem diretamente no navegador a maioria dos jogos casuais. Vimos que eles têm restrições, embora a maioria não atrapalhe o desenvolvimento de um jogo desse tipo.

Também estudamos que com janelas, teremos um controle muito maior do ciclo de pintura e da resolução do cliente e, portanto, é mais adequada para jogos mais hardcore e imersivos.

A decisão agora de qual caminho seguir é inteiramente sua.


Comentários (8)
  • William Antônio Siqueira  - JavaFX
    avatar

    Cara, parabéns pelo artigo, site e tudo mais, parabéns mesmo! Queria eu ser iniciante e ter lido esse seu artigo sobre AWT e Swing, pois no começo era muito confuso!

    Vou acompanhar o site, espero artigos sobre JavaFX futuramente :D

    Aproveitei para fazer uma propaganda no meu twitter:

    http://twitter.com/William_Antonio/status/5518647956

    mas só porque gostei do site mesmo! Parabéns!

  • Vinícius Godoy de Mendonça
    avatar

    Obrigado pelo comment! E pela propaganda também! :)

  • Bruno  - Parabens
    avatar

    Legal e interesante fica o pedido um pedido espero que aborde a logica de desenho de mapas em games de rpg sem usar frameworks. Vi uma vez que erão algums loops sobre loops mais seria interesante um artigo sobre o assunto.

  • Vinícius Godoy de Mendonça  - Pedido anotado!
    avatar

    Pedido anotado!

  • Jorge da Silva Abreu  - JPanel fora de Janelas (JFrame, Frame, JInternalFr
    avatar

    Boa tarde Vinicius Godoy.

    Gostaria de lhe fazer uma pergunta.

    Há possibilidade de visualizar um JPanel fora das janelas existentes no Java, ou seja, fazer um JPanel como uma janela principal :?:

    E parabéns pelo artigo.

    Jorge da Silva Abreu.

  • Vinícius Godoy de Mendonça
    avatar

    Não é possível. Mas você pode simular esse efeito fazendo:

    suaJanela.setUndecorated(true);

    Isso irá remover toda decoração da janela: bordas e barra de título.

  • Juan Carlos barbosa
    avatar

    Queria Aprender a fazer o Design de Games acho legal fazer esses jogos online poderia me ajudar nessa conquista? :huh: :?:

  • Vinícius Godoy de Mendonça
    avatar

    E qual é a sua dúvida, especificamente?

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter