Renderização usando JApplet ou Frame veja explicação na mensagem

2 respostas
vinians

Amigos, aqui é o perguntador mor do fórum!
É o seguinte, eu estou fazendo uma microengine pros meus jogos usando Java. Graças a ajuda de vocês até agora está dando tudo certo. Porém eu estou tentando uma flexibildiade que não estou conseguindo. Eu gostaria que a minha classe fosse capaz de receber como parametro do seu construtor ou de um de seus construtores uma referencia a um JFrame ou JApplet, sendo assim a engine seria capaz de “renderizar” o buffer neste container. Eu ja consegui fazer isso perfeitamente com JFrame porem com JApplet não esta dando certo da um pau em runtime. Alguem tem uma solução para isso? Veja um pedaço do código:

private void init(int w, int h)
	{
		this.w = w;
		this.h = h;
		image  = new  BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		buffer = image.createGraphics();
		rooms  = new ArrayList<Room>();
		thJogo = null;
	}
	public Game(Container root, int w, int h)
	{
		init(w, h);
		target = root;
	}

Veja que o construtor da classe recebe um Container (root) porque ? Porque a classe Container foi a unica que achei comum as duas classes JFrame e JApplet. Veja mais códigos:

public void execute()
	{
		JFrame jf;
		target.setSize(w, h);
		if (target instanceof JFrame)
		{
			jf = (JFrame) target;
			jf.setLocationRelativeTo(null);
			jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		}
		target.setVisible(true);
	
		thJogo = new Thread(this);
		thJogo.start();
	}

Esse méto prepara para a execucão que ocorre no método run() executado pela Thread.
Classe que testa tudo:

public class TestaInstance extends JApplet
{
	Game game;
	Room room;
	final int W = 640;
	final int H = 480;
	JFrame f;
	public TestaInstance(String title)
	{
		//Cria uma nova instancia do jogo
		game = new Game(this, W, H);
		//Adiciona uma room ao jogo
		room = new Room(game);
		//Adiciona instancias na room
		Instance in; 
		in = new Instance(150, 150,  0, 0, 0);
		in.setShape(new Line2D.Float(0, 0, 10, 10));
		room.addInstance(in);
		
		in = new Instance(10, 50,  0, 0, 0);
		in.setShape(new Rectangle2D.Float(0,0, 10, 10));
		room.addInstance(in);
		//Adiciona a room no jogo
		game.addRoom(room);
		game.execute();
	}
	
	public static void main(String args[])
	{
		TestaInstance ti = new TestaInstance("Instance Test");

	}

}

Alguem poderia me dar uma luz?
Obrigado!

2 Respostas

ViniGodoy

Tenho algumas dúvidas:

  1. Para que você cria essa imagem chamada “buffer”? O swing já implementa double buffering por padrão, nao é necessário uma terceira imagem;
  2. Por que você não trabalha com a classe BufferStrategy? Como expliquei no ponto v, ela garante além do double buffering, page flipping, que é um recurso que exige comunicação com o hardware de vídeo;
  3. Não existe mesmo ancestral comum entre o JFrame o JApplet. No caso, receba um component e para o JApplet, crie um canvas que ocupa a janela inteira.
vinians

Opa amigão, obrigado por responder, vou responder suas perguntas:

Eu faço assim pois foi o jeito mais simples que encontrei. Cria-se uma imagem, desenha tudo nela e joga para algum local capaz de mostra-la, um applet ou um frame, tem dado certo assim, não pisca, e é muito simples de entender pra mim que estou beeemmmm no inicio da aprendizagem Java.

Sim, eu pretendo fazer isso mais pra frente quando estiver mais esperto no Java, mesmo porque isso não vai afetar a minha engine pois a interface dela permancerá a mesma para os jogos que eu criar utilizando a mesma. Mas pretendo sim melhorar ao máximo, mas tenho que entender TUDO o que faço e desse modo que estou fazendo até agora eu tenho entendido mais facil.

O ancestral comum que encontrei foi o “Container” porem não estava dando certo, mas vou tentar criar esse canvas que você está dizendo, talvez funcione.

Estou aberto a sugestões dentro do contexto atual do meu framework! Obrigado!

Criado 23 de maio de 2011
Ultima resposta 23 de mai. de 2011
Respostas 2
Participantes 2