Applet Imagens a piscar

32 respostas
B

Ola mundo, venho hoje pedir ajuda a um dos meus maiores problemas , tenho um projecto para a acabar e apresentar daqui a uma semana.Projecto esse que e um jogo feito para applet.

o jogo tem todo o código certo faz tudo o que eu desejei, mas as imagens não param de piscar e uma dor de cabeça só de olhar. ja tentei buffer 1 e 2 mas não deu.

vou deixar aqui como tenho o meu buffer actualmente.

Buffer

public void update(Graphics g){
		if(i==null){
			i= createImage(this.getSize().width,this.getSize().height);
			doubleG=i.getGraphics();			
		}		
		doubleG.setColor(getBackground());
		doubleG.fillRect(0, 0, this.getSize().width, this.getSize().height);
		doubleG.setColor(getForeground());	
		paint(doubleG);
		g.drawImage(i, 0, 0, this);
		}

Este e o loop

public void run() {
		loadImages();
		running = true;

		addMouseListener(this);
		addMouseMotionListener(this);
		addMouseWheelListener(this);
		
		loadImages();
while (running) {
			timePassed = System.currentTimeMillis() - cumTime;
			cumTime+=timePassed;
			System.out.println(System.currentTimeMillis());
			System.out.println(cumTime);
			System.out.println(timePassed);
			updateMove(timePassed);
			updatePrisao( timePassed);
			preso1.update(timePassed);
			preso2.update(timePassed);
			preso3.update(timePassed);
			preso4.update(timePassed);		
			
repaint();		
			try {
				Thread.sleep(20);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
public void loadImages() {

		bg = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/back[Converted].png")
				.getImage();

		baseFinal = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/final[Converted].png")
				.getImage();
		baseInicial = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/inicial[Converted].png")
				.getImage();
		skate = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/skate[Converted].png")
				.getImage();

//nao tao todos os loads mas sao todos feitos assim
}

Aqui e o Paint

public void draw(Graphics g){
			g.drawImage(bg, 0, 0, null);

			g.drawImage(baseFinal, 605, 450, null);
			g.drawImage(baseInicial, 0, 450, null);
			g.drawImage(menuUtilizador, 600, 281, null);
}

Estão ai todos os métodos relacionados com as minhas imagens

Preciso de ajuda pff

32 Respostas

matheuslmota

Vamos lá.
[list]Você deve sobrecarregar o método paintComponent no lugar do método update[/list]
[list]ao sobrecarregar o método paintComponent é importante que você faça dessa forma:[/list]

protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics g2 = g.create(); // Seu código de manipulação com o graphics aqui, usando a variável g2, no lugar de usar g. g2.dispose(); }
[list]Faça todas as manipulações gráficas dentro do paintComponent()[/list]
[list]Chame o método repaint() para atualizar a interface. O método repaint() chama o método paintComponent()[/list]

B

Faça todas as manipulações gráficas dentro do paintComponent()

Chame o método repaint() para atualizar a interface. O método repaint() chama o método paintComponent();

nao percebi estes dois pontos . pode explicar sff

matheuslmota

bluecora:
Faça todas as manipulações gráficas dentro do paintComponent()

Chame o método repaint() para atualizar a interface. O método repaint() chama o método paintComponent();

nao percebi estes dois pontos . pode explicar sff

Quando você precisar fazer algum desenho na tela, ou algo do tipo, coloque isso dentro de paintComponent().
Basicamente, coloque as implementações dentro de update e draw dento de paintComponent.

Se você quiser atualizar a tela, chame o método rapaint(). O método repaint() chama o método paintComponent() implicitamente.

B

amigo fiquei nesta situaçao

public void paintComponenet(Graphics g){
		

			super.paintComponents(g);  
		     Graphics g2 = g.create();  
				
		     g2.dispose();  
		     
				if (start) {
					g2.drawImage(menu, 0, 0, null);
					if (emCimaB1)
						g.drawImage(botao1, 310, 300, null);
					else
						g.drawImage(botao2, 310, 300, null);
				} else {

					g2.drawImage(bg, 0, 0, null);

					g2.drawImage(baseFinal, 605, 450, null);
					g2.drawImage(baseInicial, 0, 450, null);
					g2.drawImage(menuUtilizador, 600, 281, null);

					g2.drawImage(rampa, rampaX, rampaY, null);
					if (rampaY + 50 <= 500 || rampaX <= 200) {
						g.drawImage(rampa, 1000, 1000, null);
						rampaX = 1000;
						rampaY = 1000;
					}

					g2.drawImage(skate, skateX, skateY, null);
					if (skateY + 20 <= 500 || skateX <= 200) {
						g.drawImage(skate, 1000, 1000, null);
						skateX = 1000;
						skateY = 1000;
					}

					g2.drawImage(preso1.getImage(), 200, 0, null);
					g2.drawImage(preso2.getImage(), 300, 0, null);
					g2.drawImage(preso3.getImage(), 400, 0, null);
					g2.drawImage(preso4.getImage(), 500, 0, null);

					g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),
							Math.round(sprite.getY()), null);
					g2.drawImage(policia.getImage(), 40, 322, null);

					g2.drawString(mess, 400, 600);
					g2.drawImage(cela.getImage(), Math.round(cela.getX()),
							Math.round(cela.getY()), null);

					g2.drawString(messe, 40, 50);
				}
				
		     
		     
				
		     
		}  

	
	
	
	
	public void paint(Graphics g) {
		paintComponenet( g);
	}

	public void update(Graphics g){
		
	}

matenho o loop como apresentei inicialmente

matheuslmota

Cara, tem dois erros. O primeiro é que você não pode chamar o dispose de um graphics antes de ter usado ele. O segundo é que você não deve sobrescrever o método paint e fazer ele chamar o paintComponent. O que acontece é que quando você chama o método repaint, esse método (que não deve ser sobrescrito), chama o método paintComponent. Além do mais, o método paint também não deve ser sobrescrito, somente o médo paintComponent é que deve. Corrigindo seu código, ficou assim:

protected void paintComponent(Graphics g){
	super.paintComponents(g);  
	Graphics g2 = g.create();  
	if (start) {
		g2.drawImage(menu, 0, 0, null);
		if (emCimaB1)
			g.drawImage(botao1, 310, 300, null);
		else
			g.drawImage(botao2, 310, 300, null);
	} else {

		g2.drawImage(bg, 0, 0, null);

		g2.drawImage(baseFinal, 605, 450, null);
		g2.drawImage(baseInicial, 0, 450, null);
		g2.drawImage(menuUtilizador, 600, 281, null);

		g2.drawImage(rampa, rampaX, rampaY, null);
		if (rampaY + 50 <= 500 || rampaX <= 200) {
			g.drawImage(rampa, 1000, 1000, null);
			rampaX = 1000;
			rampaY = 1000;
		}

		g2.drawImage(skate, skateX, skateY, null);
		if (skateY + 20 <= 500 || skateX <= 200) {
			g.drawImage(skate, 1000, 1000, null);
			skateX = 1000;
			skateY = 1000;
		}

		g2.drawImage(preso1.getImage(), 200, 0, null);
		g2.drawImage(preso2.getImage(), 300, 0, null);
		g2.drawImage(preso3.getImage(), 400, 0, null);
		g2.drawImage(preso4.getImage(), 500, 0, null);

		g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),
				Math.round(sprite.getY()), null);
		g2.drawImage(policia.getImage(), 40, 322, null);

		g2.drawString(mess, 400, 600);
		g2.drawImage(cela.getImage(), Math.round(cela.getX()),
				Math.round(cela.getY()), null);

		g2.drawString(messe, 40, 50);
	}		
	g2.dispose();  // Aqui é que o objeto g2 deve ser liberado.
}

Apague esses métodos update de paint da sua classe.

B

Meu estado actual esta assim como voce disse

paintComponenet

public void paintComponenet(Graphics g){  

		super.paintComponents(g);    
	    Graphics g2 = g.create();    
	    if (start) {  
	        g2.drawImage(menu, 0, 0, null);  
	        if (emCimaB1)  
	            g2.drawImage(botao1, 310, 300, null);  
	        else  
	            g2.drawImage(botao2, 310, 300, null);  
	    } else {  
	  
	        g2.drawImage(bg, 0, 0, null);  
	  
	        g2.drawImage(baseFinal, 605, 450, null);  
	        g2.drawImage(baseInicial, 0, 450, null);  
	        g2.drawImage(menuUtilizador, 600, 281, null);  
	  
	        g2.drawImage(rampa, rampaX, rampaY, null);  
	        if (rampaY + 50 <= 500 || rampaX <= 200) {  
	            g.drawImage(rampa, 1000, 1000, null);  
	            rampaX = 1000;  
	            rampaY = 1000;  
	        }  
	  
	        g2.drawImage(skate, skateX, skateY, null);  
	        if (skateY + 20 <= 500 || skateX <= 200) {  
	            g.drawImage(skate, 1000, 1000, null);  
	            skateX = 1000;  
	            skateY = 1000;  
	        }  
	  
	        g2.drawImage(preso1.getImage(), 200, 0, null);  
	        g2.drawImage(preso2.getImage(), 300, 0, null);  
	        g2.drawImage(preso3.getImage(), 400, 0, null);  
	        g2.drawImage(preso4.getImage(), 500, 0, null);  
	  
	        g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),  
	                Math.round(sprite.getY()), null);  
	        g2.drawImage(policia.getImage(), 40, 322, null);  
	  
	        g2.drawString(mess, 400, 600);  
	        g2.drawImage(cela.getImage(), Math.round(cela.getX()),  
	                Math.round(cela.getY()), null);  
	  
	        g2.drawString(messe, 40, 50);  
	    }         
	    g2.dispose();  
	}

Loop

public void run() {
		
		running = true;
		loadImages();
		addMouseListener(this);
		addMouseMotionListener(this);
		addMouseWheelListener(this);
		
		while (running) {
			
			timePassed = System.currentTimeMillis() - cumTime;
			cumTime+=timePassed;
			
			System.out.println(System.currentTimeMillis());
			System.out.println(cumTime);
			System.out.println(timePassed);
			
			updateMove(timePassed);
			updatePrisao( timePassed);
			preso1.update(timePassed);
			preso2.update(timePassed);
			preso3.update(timePassed);
			preso4.update(timePassed);
			
			
			repaint();
			
			
			try {
		
				Thread.sleep(20);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

resultado e a tela em branco, parece que não esta a a fazer o loadImages().
terei eu de apagalo e passar esse cogigo para dentro da classe paintComponenet?

matheuslmota

Você deve está fazendo isso dentro de um Panel. Sendo assim, você tem que colocar o método loadImages para ser chamado dentro do construtor do seu panel.
Quando o componente é criado (por exemplo, o panel), o método paintComponent é chamado. Se as imagens não tiverem sido carregadas, então não vai ser desenhado nada mesmo.
Coloque o método loadImages dentro do construtor do seu panel e teste novamente.

B

descobri o problema amigo, o nosso repaint() não esta a chamar o paintComponents(). não sei porque! mas dentro do paintComponents() mete System.out.println(“Estou aqui”); E não apareceu na consola.

matheuslmota

Tá errado. O método repaint chama o método paintComponent. Isso está muito estranho. Esse método repaint é o método repaint do seu Panel? Outra coisa, a classe que está fazendo esses desenhos estende o quê? Panel?

B

pode explicar esse Panel?

matheuslmota

Sua classe estende o quê?

matheuslmota

Teria como colocar o código da classe completa? Tem algum detalhe que você está esquecendo de botar no código.

B
matheuslmota

Faça assim. Sobrescreva o método init() da sua applet e dentro dele coloque a chamada ao método loadImages. Deixe o método paintComponent do jeito que eu postei logo acima.

B

fiz isso, o problema mantém-se o método paintComponents() não inicializa.

matheuslmota

Rapaz, notei uma coisa agora, você declarou o método da maneira errada no seu código. Colocou paintComponenete. Declare-o assim:

B
protected void paintComponent(Graphics g){  
	
		super.paintComponents(g);    
	    Graphics g2 = g.create();    
	    if (start) {  
	        g2.drawImage(menu, 0, 0, null);  
	        if (emCimaB1)  
	            g2.drawImage(botao1, 310, 300, null);  
	        else  
	            g2.drawImage(botao2, 310, 300, null);  
	    } else {  
	  
	        g2.drawImage(bg, 0, 0, null);  
	  
	        g2.drawImage(baseFinal, 605, 450, null);  
	        g2.drawImage(baseInicial, 0, 450, null);  
	        g2.drawImage(menuUtilizador, 600, 281, null);  
	  
	        g2.drawImage(rampa, rampaX, rampaY, null);  
	        if (rampaY + 50 <= 500 || rampaX <= 200) {  
	            g2.drawImage(rampa, 1000, 1000, null);  
	            rampaX = 1000;  
	            rampaY = 1000;  
	        }  
	  
	        g2.drawImage(skate, skateX, skateY, null);  
	        if (skateY + 20 <= 500 || skateX <= 200) {  
	            g2.drawImage(skate, 1000, 1000, null);  
	            skateX = 1000;  
	            skateY = 1000;  
	        }  
	  
	        g2.drawImage(preso1.getImage(), 200, 0, null);  
	        g2.drawImage(preso2.getImage(), 300, 0, null);  
	        g2.drawImage(preso3.getImage(), 400, 0, null);  
	        g2.drawImage(preso4.getImage(), 500, 0, null);  
	  
	        g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),  
	                Math.round(sprite.getY()), null);  
	        g2.drawImage(policia.getImage(), 40, 322, null);  
	  
	        g2.drawString(mess, 400, 600);  
	        g2.drawImage(cela.getImage(), Math.round(cela.getX()),  
	                Math.round(cela.getY()), null);  
	  
	        g2.drawString(messe, 40, 50);  
	    }         
	    g2.dispose();  
	    System.out.println("Estou aqui");
	}

não reparei desculpa,fiz a alteração mas ainda não pinta

matheuslmota

Você sobrescreveu o método init e colocou nele a chamada ao método loadImages?
Use sua IDE pra sobrescrever esse método. Se você declarar o método com a assinatura diferente, você não estará sobrescrevendo nada e o browser não chamará o método correto.

B

Use sua IDE pra sobrescrever esse método? não percebi essa parte.

sim coloquei no ini(), loadImages().

vou colocar aqui os métodos que estamos a analizar!

public void loadImages() {

		bg = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/back[Converted].png")
				.getImage();

		baseFinal = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/final[Converted].png")
				.getImage();
		baseInicial = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/inicial[Converted].png")
				.getImage();
		skate = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/skate[Converted].png")
				.getImage();
		rampa = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/rampa[Converted].png")
				.getImage();

		menu = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/menu[Converted].png")
				.getImage();
		menuUtilizador = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/menuUtilizador[Converted].png")
				.getImage();

		botao1 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/BotaoIniciar1[Converted].png")
				.getImage();
		botao2 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/BotaoIniciar2[Converted].png")
				.getImage();

		Image police1 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image1.png").getImage();
		Image police2 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image2.png").getImage();
		Image police3 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image3.png").getImage();
		Image police4 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image4.png").getImage();
		Image police5 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image5.png").getImage();
		Image police6 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image6.png").getImage();
		Image police8 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image8.png").getImage();
		Image police9 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image9.png").getImage();
		Image police10 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Policia/Image10.png").getImage();

		Image prisao = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/prisao[Converted].png")
				.getImage();

		//
		Image cela1 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/primeiro[Converted].png")
				.getImage();
		Image cela12 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/primeiro1[Converted].png")
				.getImage();
		Image cela13 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/primeiro2[Converted].png")
				.getImage();

		Image cela2 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/segundo[Converted].png")
				.getImage();
		Image cela22 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/segundo1[Converted].png")
				.getImage();
		Image cela23 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/segundo2[Converted].png")
				.getImage();

		Image cela3 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/treceiro[Converted].png")
				.getImage();
		Image cela32 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/treceiro2[Converted].png")
				.getImage();
		Image cela33 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/treceiro3[Converted].png")
				.getImage();

		Image cela4 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/preso4[Converted].png")
				.getImage();
		Image cela42 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/preso41[Converted].png")
				.getImage();
		Image cela43 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Vectores/preso42[Converted].png")
				.getImage();

		//

		Image ladrao1 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Ladrao/ladrao2test.png").getImage();
		Image ladrao2 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Ladrao/ladrao3test.png").getImage();
		Image ladrao3 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Ladrao/ladrao4test.png").getImage();
		Image ladrao4 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Ladrao/ladrao5test.png").getImage();
		Image ladrao5 = new ImageIcon(
				"C:/Users/Rui/Dropbox/Ladrao/ladrao6test.png").getImage();

		policia = new Animation();
		policia.addScene(police1, 50);
		policia.addScene(police2, 50);
		policia.addScene(police3, 50);
		policia.addScene(police4, 50);
		policia.addScene(police5, 50);
		policia.addScene(police6, 50);
		policia.addScene(police8, 50);
		policia.addScene(police9, 50);
		policia.addScene(police10, 50);

		//

		preso1 = new Animation();
		preso1.addScene(cela1, 150);
		preso1.addScene(cela12, 150);
		preso1.addScene(cela1, 150);
		preso1.addScene(cela13, 150);
		preso1.addScene(cela1, 150);

		preso2 = new Animation();
		preso2.addScene(cela2, 150);
		preso2.addScene(cela22, 150);
		preso2.addScene(cela2, 150);
		preso2.addScene(cela23, 150);
		preso2.addScene(cela2, 150);

		preso3 = new Animation();
		preso3.addScene(cela3, 150);
		preso3.addScene(cela32, 150);
		preso3.addScene(cela3, 150);
		preso3.addScene(cela33, 150);
		preso3.addScene(cela3, 150);

		preso4 = new Animation();
		preso4.addScene(cela4, 150);
		preso4.addScene(cela42, 150);
		preso4.addScene(cela4, 150);
		preso4.addScene(cela43, 150);
		preso4.addScene(cela4, 150);

		//

		ladrao = new Animation();
		ladrao.addScene(ladrao1, 50);
		ladrao.addScene(ladrao2, 50);
		ladrao.addScene(ladrao3, 50);
		ladrao.addScene(ladrao4, 50);
		ladrao.addScene(ladrao5, 50);

		sprite = new Sprite(ladrao);
		sprite.setX(180);
		sprite.setY(340);
		sprite.setVelocityX(0.2f);
		sprite.setVelocityY(0.3f);

		celaFinal = new Animation();
		celaFinal.addScene(prisao, 150);
		celaFinal.addScene(prisao, 150);
		cela = new Sprite(celaFinal);
		cela.setX(600);
		cela.setY(2);
		cela.setVelocityX(0);
		cela.setVelocityY(0.2f);

	}

	public void init() {
		setSize(800, 600);
		loadImages();
	}

	public void start() {
		Thread thread = new Thread(this);
		thread.start();

	}

	@Override
	public void run() {

		running = true;
		
		addMouseListener(this);
		addMouseMotionListener(this);
		addMouseWheelListener(this);
		
		startingTime=System.currentTimeMillis();
		cumTime= startingTime;
		
		while(running){
		timePassed = System.currentTimeMillis() - cumTime;
			cumTime+=timePassed;
			
			System.out.println(timePassed);
			System.out.println(startingTime);
			System.out.println(cumTime);
			
	
			
			updateMove(timePassed);
			updatePrisao( timePassed);
			preso1.update(timePassed);
			preso2.update(timePassed);
			preso3.update(timePassed);
			preso4.update(timePassed);

			
			repaint();
			
			try {
		
				Thread.sleep(20);
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public void stop() {
		running = false;
	}


	public void destroy() {
		running = false;

	}
	
	 

	protected void paintComponent(Graphics g){  
	
		super.paintComponents(g);    
	    Graphics g2 = g.create();    
	    if (start) {  
	        g2.drawImage(menu, 0, 0, null);  
	        if (emCimaB1)  
	            g2.drawImage(botao1, 310, 300, null);  
	        else  
	            g2.drawImage(botao2, 310, 300, null);  
	    } else {  
	  
	        g2.drawImage(bg, 0, 0, null);  
	  
	        g2.drawImage(baseFinal, 605, 450, null);  
	        g2.drawImage(baseInicial, 0, 450, null);  
	        g2.drawImage(menuUtilizador, 600, 281, null);  
	  
	        g2.drawImage(rampa, rampaX, rampaY, null);  
	        if (rampaY + 50 <= 500 || rampaX <= 200) {  
	            g2.drawImage(rampa, 1000, 1000, null);  
	            rampaX = 1000;  
	            rampaY = 1000;  
	        }  
	  
	        g2.drawImage(skate, skateX, skateY, null);  
	        if (skateY + 20 <= 500 || skateX <= 200) {  
	            g2.drawImage(skate, 1000, 1000, null);  
	            skateX = 1000;  
	            skateY = 1000;  
	        }  
	  
	        g2.drawImage(preso1.getImage(), 200, 0, null);  
	        g2.drawImage(preso2.getImage(), 300, 0, null);  
	        g2.drawImage(preso3.getImage(), 400, 0, null);  
	        g2.drawImage(preso4.getImage(), 500, 0, null);  
	  
	        g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),  
	                Math.round(sprite.getY()), null);  
	        g2.drawImage(policia.getImage(), 40, 322, null);  
	  
	        g2.drawString(mess, 400, 600);  
	        g2.drawImage(cela.getImage(), Math.round(cela.getX()),  
	                Math.round(cela.getY()), null);  
	  
	        g2.drawString(messe, 40, 50);  
	    }         
	    g2.dispose();  
	    System.out.println("Estou aqui");
	}
matheuslmota

Bom, como está usando JApplet, não use o método paintComponent, use o método paint mesmo (eu confundi com o método paint do Panel, que não deve ser sobrescrito).
Coloque o conteúdo de paintComponent dentro do método paint (novamente, tome cuidado para sobrescrever o método corretamente) e apague o método paintComponent.

ViniGodoy

Solução a)
Desenhe sobre uma BufferedImage e, só ao final, desenhe a BufferedImage na tela (isso é chamado de double buffering).

Solução b) Use active rendering:
http://pontov.com.br/site/java/48-java2d/124-desenho-direto-active-rendering

B

Amigo podes explicar como faço esse double bufering?

ViniGodoy

Eu já expliquei, o que você não entendeu?

B

Nao sei como criar esse metodo! ja vi alguns mas nao sei se estou a fazer correctamente

ViniGodoy
protected void paintComponent(Graphics g){    
    BufferedImage buffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2d g2 = buffer.createGraphics();          
    super.paintComponents(g2);      
    
    if (start) {    
        g2.drawImage(menu, 0, 0, null);    
        if (emCimaB1)    
            g2.drawImage(botao1, 310, 300, null);    
        else    
            g2.drawImage(botao2, 310, 300, null);    
    } else {    
    
        g2.drawImage(bg, 0, 0, null);    
    
        g2.drawImage(baseFinal, 605, 450, null);    
        g2.drawImage(baseInicial, 0, 450, null);    
        g2.drawImage(menuUtilizador, 600, 281, null);    
    
        g2.drawImage(rampa, rampaX, rampaY, null);    
        if (rampaY + 50 &lt;= 500 || rampaX &lt;= 200) {    
            g2.drawImage(rampa, 1000, 1000, null);    
            rampaX = 1000;    
            rampaY = 1000;    
        }    
    
        g2.drawImage(skate, skateX, skateY, null);    
        if (skateY + 20 &lt;= 500 || skateX &lt;= 200) {    
            g2.drawImage(skate, 1000, 1000, null);    
            skateX = 1000;    
            skateY = 1000;    
        }    
    
        g2.drawImage(preso1.getImage(), 200, 0, null);    
        g2.drawImage(preso2.getImage(), 300, 0, null);    
        g2.drawImage(preso3.getImage(), 400, 0, null);    
        g2.drawImage(preso4.getImage(), 500, 0, null);    
    
        g2.drawImage(sprite.getImage(), Math.round(sprite.getX()),    
                Math.round(sprite.getY()), null);    
        g2.drawImage(policia.getImage(), 40, 322, null);    
    
        g2.drawString(mess, 400, 600);    
        g2.drawImage(cela.getImage(), Math.round(cela.getX()),    
                Math.round(cela.getY()), null);    
    
        g2.drawString(messe, 40, 50);    
    }           
    g2.dispose();    
    g.drawImage(buffer, 0, 0, null);
    System.out.println(&quot;Estou aqui&quot;);  
}
B

Fazendo isso a minha tela fica toda branca .

B

Ja consegui desenhar, mas contem assim um cer low fps!e normal?

ViniGodoy

Tente trocar o getWidth() e o getHeight() pelo tamanho do seu applet.

Só para confirmar, vc chegou a inserir a linha 50?

B

Mano já ta tudo jóia! não pisca nem um pouco…

Mas imagens vectoriais não ficam bem na tela!

ViniGodoy

O que vc quer dizer com isso?

B

eu uso imagens vectoriais no meu jogo para não ficar muito pixalizado, mas como eu não crio de raiz apenas faço um tranform aplicado em applet ela não faz a extensão dos vectores, ficando a vista todos os vectores mas isso acho que agora e comigo. Obrigado por tudo estive um mês para resolver essa porra!!!

ViniGodoy

Logo depois de criar a imagem, faça:

g2.setRenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHints(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); g2.setRenderingHints(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);

Isso deve aumentar consideravelmente a qualidade do desenho.

Criado 20 de junho de 2012
Ultima resposta 21 de jun. de 2012
Respostas 32
Participantes 3