Animation korrekt darstellen

Status
Nicht offen für weitere Antworten.

skizZ

Aktives Mitglied
Hallo,

ich soll eine animation programmieren, in der sich Bilder in verschiedene Richtungen bewegen. Dies ist mir nun auch gelungen. Nun habe ich das Problem, dass bei
repaint() nicht die update() Methode aufgerufen wird(obs benötigt wird ungewisse)

Schlimmer ist eher, dass jedes Bild einen schwarzen Balken durch das Applet zieht. Dies sollte möglichst nicht passieren.

Woran liegt das und wie kann ich dies korrigieren?
Hier mal der code

Java:
public class Animation extends JApplet implements Runnable{  
	Image pictures[] = new Image[4];
	  String files[] = { "new-1.gif", "new-2.gif", "new-3.gif",
	                     "new-4.gif", };
	  Picture p1, p2;
	  Image m_ImgBuffer;
	  private List<Picture> picList =
	        Collections.synchronizedList(new ArrayList<Picture>());
	  
	   private Graphics dbGraphics;
	   

public void init() {  
	this.setSize(new Dimension(500, 500));
	
} 

public void addPic(Picture picture)
{
    picList.add(picture);
    new Thread(this).start();
}

public void start() {
	int i;
	System.out.println("TEST");
    MediaTracker tracker = new MediaTracker(this);

    for (i=0; i < pictures.length; i++)
    {
      pictures[i] = getImage(getDocumentBase(), files[i]);
      tracker.addImage(pictures[i], i); // i ist ein Identifikator dieses Bildes
      System.out.println("TEST");
      try
      {
         tracker.waitForID(i);
      }
      catch(InterruptedException e) {}
    }
    p1 = new Picture(pictures[0], 10, 10, 1, 1);
    p2 = new Picture(pictures[1], 50, 50, 1, 0);
    
    addPic(p1);
    addPic(p2);
}

public void run() { 
	while(true) {
		repaint();
		try { 
			for (Picture picture : picList)
            {
				if(picture.x < this.getSize().width)
				{
				picture.x += picture.newx;
				} else { picture.x = picture.stdx; }
				if(picture.y < this.getSize().height)
				{
				picture.y += picture.newy;
				} else { picture.y = picture.stdy; }
            }
			Thread.sleep(40);
			 repaint();
		}  
		catch (InterruptedException e){}
	}
}

public void paint(Graphics g) { 
	synchronized (pictures)
    {
	for (Picture picture : picList)
    {
        g.drawImage(picture.image, picture.x, picture.y, this);
     }
	}
}

class Picture
{
	Image image;
	int x, y, newx, newy, stdx, stdy;
	public Picture(Image image, int x, int y, int newx, int newy)
	{
		this.image = image;
		this.x = x;
		this.y = y;
		this.newx = newx;
		this.newy = newy;
		this.stdx = x;
		this.stdy = y;
	}
	
}

Danke
skizZ
 

Marco13

Top Contributor
Wenn du in der paint-Methode vom Applet zeichnest, musst du den Hintergrund mit einem
g.setColor(getBackground());
g.fillRect(getWidth(),getHeight());
löschen. Dann flackert es, und du musst dich um's double Buffering kümmern. Alternative: Auf eine JComponent zeichnen, und dort paintComponent überschreiben. ;)
 

skizZ

Aktives Mitglied
Hi Marco,

danke mal wieder für deine Antwort ;-)
Das mit dem flackern kenne ich, habe es auch schon so versucht wie du beschrieben hast.

Allerdings kann ich kein Double Buffering erreichen, da ich irgendwie die update() Methode dafür nicht überschreiben kann ...

Java:
public void update(Graphics g){
		if (m_ImgBuffer == null) {
        	m_ImgBuffer = createImage(getWidth(),getHeight());		
    	}
        Graphics bufferGraphics = m_ImgBuffer.getGraphics();
        bufferGraphics.clearRect(0,0,getWidth(),getHeight());
        paint(bufferGraphics);
        g.drawImage(m_ImgBuffer,0,0,this); 
    	System.out.println("UPDATE");
	}
 

skizZ

Aktives Mitglied
Nabend,

gesagt, getan. Nun habe ich aber irgendwie das Gefühl, dass dies nun ruckelt Es springt teilweise ein wenig, weiss nicht wie ichs beschreiben soll... und es lässt sich scheinbar nicht als Applet im Browser einbinden.

Hier mal mein Code

Java:
import java.awt.*;

import javax.swing.*;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;


public class Animation extends JApplet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	

	public void init() {
		this.setSize(800, 600);
		int i;
		Bilder[] b = new Bilder[4];
	    MediaTracker tracker = new MediaTracker(this);
	   
		for(i=0;i<b.length;++i) {
			if(i==0)
				b[i]=new Bilder(-100,-150,"new-1.gif",1,1);
			if(i==1)
				b[i]=new Bilder(this.getSize().width,-150,"new-2.gif",-1,1);
			if(i==2)
				b[i]=new Bilder(this.getSize().width/2-100,-150,"new-3.gif",0,1);
			if(i==3)
				b[i]=new Bilder(-100,this.getSize().height/2-100,"new-4.gif",1,0);
			tracker.addImage(b[i].img, i);
			try
			{
				tracker.waitForID(i);
			}
			catch(InterruptedException e) {}
	    }	
		getContentPane().add(new malen(b));
	}
}
class malen extends JComponent implements Runnable{
	private List<Bilder> picList =
        Collections.synchronizedList(new ArrayList<Bilder>());

	public malen(Bilder[] b){
		this.b=b;
		new Thread(this).start();
		for(int i=0; i < this.b.length; i++)
			addPicture(b[i]);
	}
	
	public void addPicture(Bilder b)
    {
        picList.add(b);
    }

	public void paint(Graphics g){
		if(this.b[2].y == this.getSize().height)
		{
			this.b[2].runs += 1;
		}
		if((this.b[2].runs % 2) == 1)
		{
			g.setColor(Color.orange);
			g.fillRect(0,0,this.getSize().width,this.getSize().height);
		} else { 
			g.setColor(Color.green);
		    g.fillRect(0,0,this.getSize().width,this.getSize().height);
		}
		for (Bilder b : picList)
        {
            g.drawImage(b.img, b.x,b.y,this);
        }
	}
	
	
	
	public void run(){
		while(true) {
        try {
        	for (Bilder bi : picList) {
        		if(bi.x <= this.getSize().width && bi.y <= this.getSize().height) 
        		{
        			bi.x += bi.xVer;
        			bi.y += bi.yVer;
        		} 
        		else{
        			bi.x = bi.xStd;
        			bi.y = bi.yStd;
        			}   
        	}
            Thread.sleep(30);
            repaint();
        }  
        catch (InterruptedException e){}
    }
	}
	Bilder[] b;
	Image m_ImgBuffer;
}
class Bilder extends Animation{
	Image img;
	int x;
	int y;
	int xVer;
	int yVer;
	int xStd;
	int yStd;
	int runs;
	public Bilder(int x, int y, String str, int xVer, int yVer){
		this.x=x;
		this.y=y;
		this.img=getToolkit().getImage(str);
		this.xVer=xVer;
		this.yVer=yVer;
		this.xStd = x;
		this.yStd = y;
		this.runs = 1;
	}
}
 

Marco13

Top Contributor
Wenn Eclipse bei einem Programm nichts rot unterstreicht, heißte das NICHT, dass das Programm "richtig" ist.

Die Klasse "Bilder" von "Animation" erben zu lasen (das von JApplet erbt) ist gröbster Unfug - du erstellst dort 5 Applets, ist dir das klar? :noe: Das KÖNNTE auch ein Grund für eventuelle Geschwindigkeitsprobleme sein. Die init-Methode ... ja, in einer Schleife von 0 bis 4 zu laufen, und in der Schleife dann hauptsächlich zu überprüfen, ob man gerade bei 0, 1, 2 oder 3 ist .. ähm. Ja.

In Bezug auf die Geschwindigkeit (was auch immer du genau meinst) kannst du mal ein bißchen mit den Bewegungsgeschwindigkeiten (xVer und yVer) rumspielen, und ggf. einen anderen Wert beim Thread.sleep angeben.

Dass es im Browser nicht funktioniert, liegt daran, dass man in einem Applet Bilder nicht mit dem Toolkit laden darf, sondern (wie du es ja schon mal hattest) mit getImage/getCodeBase usw.
 

skizZ

Aktives Mitglied
Hi,

die von dir genannten Probleme wurden gehoben.

Es sieht jedoch immernoch so aus als würden die Grafiken zwischendurch mal einen kleinen sprung machen :-(

-------
Edit: Problem gehoben

Aus
Java:
Thread.sleep(50);
repaint();
wird
Java:
repaint();
Thread.sleep(50);
und alles wird gut :bahnhof:
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Um das vielleicht (im Nachhinein :oops: ) noch .. ansatzweise zu rechtfertigen: Beim ersten wartet er, und sagt dann (ganz schnell) "Zeichne neu und beweg' dich ein Stück" - und das Bewegen (vom nächsten Schleifendurchlauf) kommt dann vielleicht manchmal dem Zeichnen in die Quere. Beim Zweiten sagt er: "Zeichne mal neu, ich warte solange" :D
 

skizZ

Aktives Mitglied
Okay super. Ich danke dir für deine super unterstützung.
Nun funktioniert soweit alles wie es soll.

Jeder fängt mal klein an ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
E Warum macht die einfache Animation einen kleinen Fehler? AWT, Swing, JavaFX & SWT 14
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
S Ich brauche eine Idee: Animation mit teil eines Bildes AWT, Swing, JavaFX & SWT 16
H "Animation" AWT, Swing, JavaFX & SWT 2
Developer_X Nach Animation Button adden AWT, Swing, JavaFX & SWT 3
Developer_X Swing JPanel-THE ANIMATION AWT, Swing, JavaFX & SWT 3
T JFrame und Scale-Animation AWT, Swing, JavaFX & SWT 8
M Animation berechnen AWT, Swing, JavaFX & SWT 4
M Animation auf JPanel per Knopfdruck AWT, Swing, JavaFX & SWT 12
P Problem bei Animation AWT, Swing, JavaFX & SWT 2
K Animation auf GUI AWT, Swing, JavaFX & SWT 3
R ruckelfreie animation AWT, Swing, JavaFX & SWT 8
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S Animation geht nicht AWT, Swing, JavaFX & SWT 3
m@nu Animation in GlassPane: Performanceeinbruch JFrame maximiert AWT, Swing, JavaFX & SWT 17
rudi.schraml Animation von Robotern auf FactoryFloor - repaint()? AWT, Swing, JavaFX & SWT 7
J Animation - Runnable AWT, Swing, JavaFX & SWT 3
O Animation in einem JPanel AWT, Swing, JavaFX & SWT 2
H Animation startet nicht/ Thread AWT, Swing, JavaFX & SWT 6
N Animation nach einem bestimmten Ereignis starten lassen? AWT, Swing, JavaFX & SWT 4
A Problem mit Animation AWT, Swing, JavaFX & SWT 4
M Animation mit Keylistener AWT, Swing, JavaFX & SWT 2
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
J Event Handling Button "enablen" wenn Eingaben in Textfeldern korrekt sind AWT, Swing, JavaFX & SWT 1
R Swing Programm läuft nur beim Debuggen korrekt ab AWT, Swing, JavaFX & SWT 4
L JavaFX Node wird nicht korrekt angezeigt AWT, Swing, JavaFX & SWT 7
D Umlaute bei Druck nicht korrekt AWT, Swing, JavaFX & SWT 4
S Warum wird dieses Rechteck nicht korrekt gemalt? AWT, Swing, JavaFX & SWT 7
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
B Swing Umlaute nicht korrekt dargestellt AWT, Swing, JavaFX & SWT 6
A Swing GridBagLayout - constraints.anchor scheint nicht korrekt zu funktionieren? AWT, Swing, JavaFX & SWT 7
B Doublebuffering korrekt anwenden AWT, Swing, JavaFX & SWT 2
W Grafik von JFrame korrekt speichern AWT, Swing, JavaFX & SWT 7
C AWT Zaehler wird nicht korrekt angezeigt AWT, Swing, JavaFX & SWT 2
N Swing Nimbus arbeitet nicht korrekt korrekt bei setEnabled() für JMenuItem AWT, Swing, JavaFX & SWT 2
B 2D-Grafik Fisch bewegt sich nicht korrekt AWT, Swing, JavaFX & SWT 3
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
N JListenanzeige nicht korrekt AWT, Swing, JavaFX & SWT 2
N JFormattedTextField erst Verlassen, wenn Eingabe korrekt AWT, Swing, JavaFX & SWT 6
C Swing-Oberfläche wird auf einiges PCs nicht korrekt dargeste AWT, Swing, JavaFX & SWT 19
B JComboBox Flatter bzw wird nicht korrekt angezeigt? AWT, Swing, JavaFX & SWT 3
N JTable korrekt anzeigen AWT, Swing, JavaFX & SWT 2
I Swing-Oberfläche wird nicht korrekt gezeichnet AWT, Swing, JavaFX & SWT 6
M paint() zeichnet nicht korrekt AWT, Swing, JavaFX & SWT 2
L Hintergrundbild im Fenster darstellen AWT, Swing, JavaFX & SWT 9
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
ralfb1105 JavaFX Exception Message von Model Class via Controller in View darstellen AWT, Swing, JavaFX & SWT 39
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
G Ampel graphisch darstellen AWT, Swing, JavaFX & SWT 2
T JComponents zur Laufzeit auf JPanel darstellen AWT, Swing, JavaFX & SWT 10
Augenblau JavaFX Wechselnde Werte in Label darstellen AWT, Swing, JavaFX & SWT 7
H Karte mit JXMapKit darstellen AWT, Swing, JavaFX & SWT 0
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
M Jtable besser darstellen AWT, Swing, JavaFX & SWT 6
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
C Ventilator Geschwindigkeit darstellen AWT, Swing, JavaFX & SWT 1
A 3D-Grafik 3D Gitter Darstellen AWT, Swing, JavaFX & SWT 1
T Swing Aktuelle Größe eines Textes in einem Label darstellen AWT, Swing, JavaFX & SWT 3
T Kreis in Jlabel darstellen. AWT, Swing, JavaFX & SWT 13

Ähnliche Java Themen

Neue Themen


Oben