Criando um Applet básico
A tecnologia Java ficou originalmente conhecida pelo Applets, palavra que significa pequenos aplicativos. São programas que rodam embutidos dentro de outro – no caso, em navegadores da web. Embora os applets tenham também dado ao Java o stigma de linguagem lenta, hoje, com a evolução da tecnologia, eles são um opão para a criação de webgames. Neste post vamos ver o mínimo para ter um applet com game loop.
Um applet Java é uma classe derivada de JApplet, que por sua vez é um painel. Ou seja, não temos uma janela para nosso programa e sim um painel, que será embutido na janela de outro programa, no caso, um navegador da web.
Isso não nos permite obter um BufferStrategy para a janela, mas podemos ter o mesmo efeito criando um objeto do tipo Canvas, que é uma área de desenho que possui contexto gráfico, e criar um BufferStrategy para ele. Daí para frente usamos ele para fazer active rendering normalmente.
Outro ponto específico é que por rodar dentro de outro programa, não podemos trancar nossa thread principal com um loop infinito, como fizemos em outros exemplos aqui no blog. Isso é resolvido de forma simples implementando a interface Runnable na nossa classe e executando ela em uma thread separada.
Veja no código abaixo um applet simples que a cada volta do loop muda a cor da tela.
Arquivo Main.java
001package exemploapplet; 002 003import java.awt.Canvas; 004import java.awt.Color; 005import java.awt.Graphics2D; 006import java.awt.image.BufferStrategy; 007import javax.swing.JApplet; 008 009public class Main extends JApplet implements Runnable 010{ 011 int x; 012 Canvas canvas; 013 BufferStrategy bs; 014 015 @Override 016 public void init() 017 { 018 canvas = new Canvas(); 019 setIgnoreRepaint(true); 020 this.add(canvas); 021 Thread t = new Thread(this); 022 t.start(); 023 } 024 025 public void run() 026 { 027 canvas.createBufferStrategy(2); 028 bs = canvas.getBufferStrategy(); 029 while (true) 030 { 031 Thread.yield(); 032 update(); 033 render(); 034 } 035 } 036 037 public void update() 038 { 039 if (++x > 255) 040 { 041 x = 0; 042 } 043 } 044 045 public void render() 046 { 047 Graphics2D g = (Graphics2D) bs.getDrawGraphics(); 048 if (g != null) 049 { 050 g.setColor(new Color(x, x, x)); 051 g.fillRect(0, 0, getWidth(), getHeight()); 052 g.dispose(); 053 } 054 bs.show(); 055 } 056}
Em um applet não inicializamos variáveis nem criamos objetos no constructor. Isso porque a classe do applet pode ser criada muito antes de ser utilizada. Aliás, pode ser criada e acabar nem sendo utilizada porque, por exemplo, o usuário fechou o programa externo antes disso ocorrer. Carregar recursos no contructor do applet poderia levar a processamento realizado à toa nestes casos.
O que faz, então, é implementar o método ini(), herdado de JApplet, e fazer a inicialização nele. Esse método é chamado pelo programa externo quando o applet for ativado e iniciar sua execução.
No método init do exemplo acima o que fazemos é criar um objeto Canvas e adicioná-lo ao applet, além de desligar o repaint automatico do applet (porque vamos fazer active rendering). Também criamos uma thread nova para nossa classe e colocamos ela para rodar.
Quando a thread roda, ela chama o método run() da nossa classe. Nele criamos o BufferStrategy configurado para double buffering e obtemos uma referência a ele na variável “bs”. Veja que o BufferStrategy é criado para o objeto Canvas.
Em seguida entramos no loop infinito do jogo (game loop), que fica chamando update() e render(). Esse loop não possui controle de pulsos e frames, portanto vai rodar na velocidade máxima que a máquina suportar.
O método update simplesmente incrementa a variável x a cada vez que é chamado, zerando-a quando ela passa de 255. Essa variável será utilizada para determinar a cor a ser aplicada na tela.
A mudança da cor é feita no método render(), que desenha na tela utilizando o BufferStrategy obtido anteriormente. Primeiro é executado um setColor() passando para ele um objeto Color criado utilizando a variável x nas posições referentes às componentes vermelha (R), verde (G) e azul (B) da cor. Assim, teremos vários tons de ciz desde o preto (0, 0, 0) até o branco (255, 255, 255). Um fillRect() preenche com a cor selecionada a área total da tela.
O applet pode ser visualizada aqui: http://sites.google.com/site/nornberg/exemploapplet
Incluindo o applet em HTML
A seguir está um exemplo de página HTML com a tag <OBJECT>, que é utilizada para incluir o applet.
001<html> 002<head> 003 <title>ExemploApplet</title> 004</head> 005<body> 006 <center> 007 <object 008 width="640" 009 height="480" 010 type="application/x-java-applet" 011 classid="java:exemploapplet/Main.class"> 012 <param name="code" value="exemploapplet/Main.class" /> 013 <param name="archive" value="ExemploApplet.jar" /> 014 </object> 015 </center> 016</body> 017</html>
Esta tag carrega o applet pelo menos no Internet Explorer, Mozilla Firefox e Google Chrome (últimas versões). Onde está “exemploapplet/Main.class” você pode substituir pelo caminho da sua classe (pacotes e classe separados por barra. Por ponto deve funcioanr também). O parâmetro “archive” contém o caminho para o JAR do applet (gerado pelo NetBeans com o comando “construir”).
Isso é só o básico, para dar a fundamentação a quem nunca criou um applet. Em próximos posts mostrarei como incluir imagens e sons no JAR, para utilizá-los de dentro do applet.
Baixe o código fonte deste artigo.
Postado em Técnico
.
.
Deixe seu comentário