Desenhando o conteudo de um Graphics em cima de outro Graphics

3 respostas
Z

Olá =]

O que estou querendo fazer pode ser melhor explicado com o código a seguir, de modo muito simplificado. Estou usando a classe Applet e AWT.

public void paint(Graphics g){

    engine.desenhaImagens(g);
    engine.desenhaTexto(g);

}

Class Engine:

public void desenhaTexto(Graphics g) {
  g.drawImage(Imagens.getBufferedImage(this.texto),0,0,null);
}

public void desenhaImagens(Graphics g) {
  g.drawImage(Imagens.getBufferedImage(this.imagem),0,0,null);
}

O que eu gostaria de fazer é, ao invez de desenhar as imagens no graphics e o texto no graphics, eu desenhar a imagem em um outro graphics aparte, o texto em outro graphics aparte, e o paint simplesmente desenhar estes graphics a parte no graphics principal. Isso facilitaria para eu poder movimentar as imagens sem movimentar o texto com o g.translate() por exemplo.

Outra coisa que eu gostaria de fazer é mudar a resolução das imagens, ampliar todas as imagens 2x (ou seja, 1 pixel = 4 pixels). Se eu dou um g.scale tanto no update quanto no paint os graficos acabam ficando bastante lagados, pois mesmo se eu executo o scale uma vez só, todo refresh o applet acaba re-escalando todas as imagens do graphics que eu dei scale. (castados p/ graphics2D, para terem scale).

Obrigado des de já, e a quem puder ajudar.

[]´s Gabriel

3 Respostas

visola

Você poderia criar um BufferedImage vazio passando o tamanho da imagem, pegar o Graphics dele (getGraphics) e desenhar sua imagem num desses e outro para o texto.
Depois, quando precisar desenhá-lo no seu applet, só usar o Graphics que o paint recebe e desenhar as imagens que estão na memória.

Quanto ao scale… porque está aumentando as imagens dentro do Java? Não existe a possibilidade de usar um programa externo tipo Photoshop ou GIMP para fazer o scale e já deixá-los do tamanho que quer? Geralmente, mesmo em programas especializados, dobrar uma imagem de tamanho acaba estourando-a, não tem como porque não tem como o programa gerar informação para preencher os novos pixels gerados.

tabocu

Oi,
eu tive uma duvida parecida,
olha o que eles me disseram

http://www.guj.com.br/java/228908-desenpenho-no-redesenho

Marky.Vasconcelos

Então, voce deveria trabalhar em cima de uma copia do Graphics, assim o translate não vai passar para todo o Graphics.

Seu exemplo seria o seguinte.

public void desenhaTexto(Graphics g) {  
      Graphics2D g2d = (Graphics2D) g.create();
      g2d.drawImage(Imagens.getBufferedImage(this.texto),0,0,null);  
      g2d.dispose();
    }  
      
    public void desenhaImagens(Graphics g) {  
      Graphics2D g2d = (Graphics2D) g.create(); //Retorna um objeto com a copia da matriz de transformação

 //Operações de translate, rotation e qualquer coisa     g2d.drawImage(Imagens.getBufferedImage(this.imagem),0,0,null);  
   g2d.dispose();//Volta a matriz ao estado original    
}
Criado 10 de janeiro de 2011
Ultima resposta 10 de jan. de 2011
Respostas 3
Participantes 4