Applet flackert bei animiertem gif

b_reath

Mitglied
Hallo Leute,

ich wollte mich erkundigen wieso mein Applet flackert wenn ich ein animiertes GIF hinzufüg.

Java:
import java.applet.*; 
import java.awt.*; 

public class world extends Applet {
	Image img1, img2, img3, img4;
	
	public void init() {
		img1 = getImage(getCodeBase(), "battle_background.png");
		img2 = getImage(getCodeBase(), "bilder/gras1_day.png");
		img4 = getImage(getCodeBase(), "Laura.png");
		img3 = getImage(getCodeBase(), "243.gif");
	} 
	
	public void paint(Graphics g) {
		g.drawImage(img1, 0, 0, this);
		g.drawImage(img2, 0, 0, this);
		g.drawImage(img3, 0, 0, this);
		g.drawImage(img4, 0, 0, this);
	} 
}

Ist es weil paint bei jeder Frame von dem gif ausgeführt wird und die anderen Bilder auch nochmal "malt"?

Mit freunlichen Grüßen
b_reath
 
Das kommt daher, dass vorher der Bildschirm komplett mit einer Farbe (idR. weiß) gefüllt wird. Schau dir mal Double Buffering an, dabei wird zuerst alles auf eine Image-Instance gezeichnet und dann komplett mit dem Inhalt des Applets ersetzt.

btw. Klassennamen sollte man groß schreiben.
Ob ein animiertes gif wirklich eine gute Idee ist, weiß ich nicht. Besser wäre es vielleicht Bilder mit einen Thread zu animieren.
 
Das kommt daher, dass vorher der Bildschirm komplett mit einer Farbe (idR. weiß) gefüllt wird. Schau dir mal Double Buffering an, dabei wird zuerst alles auf eine Image-Instance gezeichnet und dann komplett mit dem Inhalt des Applets ersetzt.

btw. Klassennamen sollte man groß schreiben.
Ob ein animiertes gif wirklich eine gute Idee ist, weiß ich nicht. Besser wäre es vielleicht Bilder mit einen Thread zu animieren.

Danke für dir Information, ich werd mir mal Double Buffering anschaun.

Das ich den Klassennamen groß schreiben soll hab ich nichts dagegen, jedoch würde mich das interessieren warum man das machen sollte.
Ich habe aber mehr als 600 animierte gif datein die ich sobald sie gebraucht werden geladen werden.

Mit freundlichen Grüßen
b_reath
 
Das ich den Klassennamen groß schreiben soll hab ich nichts dagegen, jedoch würde mich das interessieren warum man das machen sollte.

warum schreibt man "das" mit Doppel s, wenn es eine Konjunktion ist?

Das sind halt einfach Konventionen, an die man sich halten sollte. Dadurch ist ein Code um einiges sauberer und einfacher zu lesen. Wenn du Klassen klein schreibst, kannst du z.B. nicht mehr ohne weiteres zwischen statischen und instanziierten Methodenaufrufen unterscheiden.
 
Danke das mit dem Double Buffering hat geklappt.

Java:
import java.applet.*; 
import java.awt.*; 
import java.util.*;
import java.text.*;

public class World extends Applet {
	Image img1, img2, img3, img4;
	
	private Image dbImage;
	private Graphics dbg;
	
	public void init() {
		img1 = getImage(getCodeBase(), "battle_background.png");
		img2 = getImage(getCodeBase(), "bilder/gras1_day.png");
		img4 = getImage(getCodeBase(), "Laura.png");
		img3 = getImage(getCodeBase(), "243.gif");
	} 
	
	public void update(Graphics g) {
		if (dbImage == null) {
			dbImage = createImage(this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics();
		}
		
		dbg.setColor(getBackground ());
		dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
		
		dbg.setColor(getForeground());
		paint(dbg);
		
		g.drawImage(dbImage, 0, 0, this);
	}
	
	public void paint(Graphics g) {
		g.drawImage(img1, 20, 20, this);
		g.drawImage(img2, 230, 25, this);
		g.drawImage(img3, 170, 45, this);
		g.drawImage(img4, 0, 0, this);
	} 
}
 
Warum lagerst du es nicht in eine andere Klasse aus? So siehst du es nicht bei jeder Änderung, und kannst die fast komplett um das Eigendliche kümmern. So nach dem Prinzip "Aus dem Auge - aus dem Sinn".

Java:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

public class World extends Applet
{
	private static final long serialVersionUID = 1L;

	private Image img;
	private DoubleBufferingController dbc;
    
	public void init()
	{
		img = getImage(getCodeBase(), "background.png");
		
		dbc = new DoubleBufferingController(this);
		dbc.setBackground(Color.RED); //Set background of buffer, default is white.
		dbc.update(this); //Update the buffer, needing if size of comp is change. (To resize buffer.)
	}
    public void paint(Graphics g)
    {
    	dbc.prepare(); //Prepare buffer for next scene.
    	Graphics bufferG = dbc.getGraphics(); //Get Graphics from buffer.
    	
    	bufferG.drawImage(img, 40, 40, this); //Draw on buffer. (Don't use 'g', otherwise the buffer overdraw the image.)
    	
    	dbc.show(g); //Show buffer on applet.
    }
    public void update(Graphics g)
	{
		paint(g);
	}
}

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;

public class DoubleBufferingController
{
	private Image buffer;
	private Graphics graphics;
	private ImageObserver observer;
	
	public DoubleBufferingController(Component comp)
	{
		super();
		update(comp);
		graphics.setColor(Color.WHITE);
	}
	private void clearBuffer()
	{
		graphics.fillRect(0, 0, buffer.getWidth(observer), buffer.getHeight(observer));		
	}
	
	public void prepare()
	{
		clearBuffer();
	}
	public void show(Graphics g)
	{
		g.drawImage(buffer, 0, 0, observer);
	}
	public void setBackground(Color c)
	{
		graphics.setColor(c);
	}
	public void update(Component comp)
	{
		buffer = new BufferedImage(comp.getWidth(), comp.getHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics newGraphics = buffer.getGraphics();
		if(graphics != null)		
			newGraphics.setColor(graphics.getColor());
		graphics = newGraphics;
		observer = comp;
	}
	
	public Graphics getGraphics()
	{
		return(graphics);
	}
}

Ich hoffe, dass das so einfach zu verstehen ist, wie ich denke.
 
Zuletzt bearbeitet:
Man kann doch den ganzen DoubleBuffering-Kram umgehen, wenn man auf das moderne Swing setzt.
In Swing sind alle Komponenten standardmäßig doppel gepuffert, die Implementierung eines solchen Mechanismus ist da nicht mehr nötig.

Java-Versionen unter 1.4.2 haben heute kaum noch Bedeutung bzw. dürften ausgestorben sein.
 

Neue Themen


Zurück
Oben