Pufferung von Images

Status
Nicht offen für weitere Antworten.

anfänger

Mitglied
Hallo Leute,

vielleicht kann mir ja jemand von euch helfen.
mein programm soll bewegung von einzelnen figuren zeichnen und in der ecke hab ich eine kleine uhr laufen, die sekundenweise sich verändert. Jetzt hab ich das Problem das mein programm scheinbar nicht hinterher kommt mit figuren bewegen, wert der uhr sekunden der uhr hochzählen und uhrzeit neu anzeigen. denn die uhrzei wird nur alle zwei sekunden neu gezeichnet, aber mit ihren richtigen werten. Die uhr hab ich auf ein Jlabel gesetzt welches wiederum auf einem Container sitzt.
Jetzt hab ich von jemanden den tipp bekommen ich musste Pufferung verwenden, aber leider verstehe ich nicht, was damit gemeint ist. Im Internet hab ich nur beispiele für applets gesehen und da wird die update-Methode überschrieben.

Kann mir jemand erklären, wie das funktionieren soll oder ein Link zu einer Seite wo mein problem in ähnlicher weise beschrieben ist?

danke
 
G

Guest

Gast
Es wäre gut wenn du ein wenig Code postest und wir ihn hier dann "zerreissen" können.

Generell würde ich für dein Problem den ImageObserver informieren das sich das
bild geändert hat,diese veranlasst ein neuzeichnen auf dem Canvas/Panel.

Stay Tuned,
Jens
 

anfänger

Mitglied
Anonymous hat gesagt.:
Generell würde ich für dein Problem den ImageObserver informieren das sich das
bild geändert hat,diese veranlasst ein neuzeichnen auf dem Canvas/Panel.
mein problem ist ja nicht, das nicht neu gezeichnet wird. der rechner kommt nur scheinbar durch die große menge an figuren die er zeichnen muss nicht hinterher sie alle im sekundentakt zu zeichnen. ich bekomm dann alle zwei sekunden die figuren gezeichnet, die sich in den zwei sekunden auch bewegen und wenn ich ihm mehr zeit lasse für die bewegung, dann schafft er sie auch alle im quasi richtigen takt zu zeichnen.
deshalb wollte ich die pufferung verwenden um meinen rechner etwas zu entlasten
 

Marce

Mitglied
Wie schon gesagt worden ist wäre hier code nicht schlecht.

Weil man muss ja herausfinden warum er so langsm ist.

Zur pufferung: die bilder schon preloaden (und/oder DoubleBuffering verwenden) hilft vielleicht
 

anfänger

Mitglied
wenn du mit proloaden die Verwendung vom Mediatracker meinst,den hab ich schon.
Aber es wäre auch nicht schlecht, wenn mir jemadn erklären würde, wie das mit der pufferung funktioniert. ich hab da nämlich null ahnung.

Hier aber erstmal der gewünschte Code.

Um die Figuren und den Hintergrund zu zeichnen, wurde di paintComponent von JPanel überschrieben
Code:
public void paintComponent( Graphics g )
{    
                MediaTracker mt = new MediaTracker(this);
                super.paintComponent(g);
                erzeugeKarte( g );
		
                int x=0;  
                int count_bm = 0;
    	 	
                ImageIcon icon = new ImageIcon();
	 	
	if(Karte.offen)//Wurde Datei ausgewählt?
 	{				
		int counter = 0;
		
                              //Hintergrund ->image_data wird nicht auf ganzen JPanel gezeichnet, da zu groß	
                              // wird nur im sichtbaren bereich des JPanels gezeichnet
		for(int z = Karte.viewPosX, l= Karte.viewPosX+Karte.BmX ; z<l;z++)
		 	for(int k = Karte.viewPosY, m = Karte.viewPosY+Karte.BmY; k<m; k++)
		  	{	
				count_bm++;
				int count_farbe = 0;
		
				Image img = Toolkit.getDefaultToolkit().createImage(
					new MemoryImageSource(256,256,image_data[x],0,256));
						
				mt.addImage(img,counter);
				try{
					mt.waitForID(counter);
				}catch(InterruptedException ie)
				{
					img = null;
					return;
				}
				g.drawImage(img,z*256,k*256,this);
				counter++;
						
				x++;	
			}
 		
	 		
	 		if(Karte.start)
	 		{
				zeichneIcon(g);
	 		}
             }
}

Die Bewegung der Spielfiguren wird in der Methode zeichneIcon festgelegt
Code:
public void zeichneIcon(Graphics g)
{
	MediaTracker mt = new MediaTracker(this);
	String tmp = "";
	String pfad = "";
	int index =0;
		
	for(int i=1, l = Karte.zaehler; i< l; i++)
	{		
		index = getPos(Karte.zeichnekoords[i][3],Karte.zeichnekoords[i][2]);
		
		//pfad aus bestimmten Informationen zusammensetzten			
		try{
			bimage = ImageIO.read(new File(pfad));
		}catch(Exception e){System.out.println("Grafik-Datei nicht gefunden");}
			
		bimage = richtigeFarbe(bimage, index);  //alle schwarzen Pixel bekommen neuen Farbwert
		bimage.flush();
			
		mt.addImage(bimage,i);
		try{
			mt.waitForID(i);
		}catch(InterruptedException ie)
		{
			bimage = null;
			return;
		}
		g.drawImage(bimage, Karte.zeichnekoords[i][0],
                                         (Karte.canY- Karte.zeichnekoords[i][1]-6-6), 20, 20 , this);
		repaint();
	}
                   //datum und Uhrzeit sind in einer Liste gespeichert und müssen nur nach auf Label geschrieben werden
	Karte.la_datum.setText(Karte.datum[Timer.zeit]);
	Karte.la_uhr.setText(Karte.uhr[Timer.zeit]);
		
	Karte.la_datum.repaint();
	Karte.la_uhr.repaint();
}

und hier wird der hintergrund erzeugt
Code:
private  void erzeugeKarte( Graphics g )
{			
                 long start, ende;
	//An welcher Stelle im Panel befinde ich mich?  
     	Point view = Karte.scrollpane.getViewport().getViewPosition();
     
     	Karte.viewPosX = (int)(view.getX()/256);
     	Karte.viewPosY = (int)(view.getY()/256);  
     	
     	int x=0;	
     			
    	if(Karte.offen)
    	{  	//wieviel Bitmaps müssen in y-Richtung übersprungen werden				
    		Karte.anzBmY = Karte.canY/256;
	    	if((Karte.canY%256)!= 0)
	    		Karte.anzBmY++;
	    		
	    	//wieviel Bitmaps muessten für die ganze Karte in x-Richtung 
	    	//gezeichnet werden
	    	Karte.anzBmX = Karte.canX/256;
	    	if((Karte.canX%256) != 0)
	    		Karte.anzBmX++;	 
	    		
	    	//Ist die View-Position noch innerhalb der 5 Bitmaps, die zu
	    	//zeichnen sind?
    	                if(Karte.viewPosX > Karte.anzBmX-6)
 			Karte.viewPosX=Karte.anzBmX-6;
 		if(Karte.viewPosY > Karte.anzBmY-5)
 			Karte.viewPosY=Karte.anzBmY-5;	 
	    
 		int z=0;
 	                //Einlesen der "kartenbild.bm", dekomprimieren der Bytes
		for(int j =Karte.viewPosX, l = Karte.viewPosX+Karte.BmX; j<l;j++)
			for(int i = Karte.viewPosY, m = Karte.viewPosY+Karte.BmY; i<m; i++)
			{
				int len = Karte.arrayPfl[(2*i+1)+2*j*Karte.anzBmY];
				int pos = Karte.arrayPfl[2*i+2*j*Karte.anzBmY];
					
				DatenEinlesen.einlesenBM(Karte.fileBM, pos, len);
			  	DatenAuswerten.dekomp(x, len);
				
				x++;
			}
	}
}


ich glaube das sind die wichtigsten Methoden. vielleicht sieht ja jemand den grund, warum ich keine Aktualisierung jede Sekunde bekomme
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben