Criando um Applet básico

placeholderantigo

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.

Autor: Luiz Nörnberg Ver todos os posts de
Sou Bacharel em Ciência da Computação pela Universidade Católica de Pelotas (UCPel), onde também atuei como professor. Desde a época da faculdade (mais de quinze anos atrás) a paixão por jogos tem sido importante no meu direcionamento profissional. Sou sócio-fundador do Izyplay Game Studio, onde exerço o cargo de Diretor de Tecnologia. Sempre tive grande foco em desenvolvimento em Java, embora tenha migrando para a tecnologia Adobe AIR em função de sua portabilidade. Ah, e é claro, dou meus palpites no game design.

Deixar um Comentário