# Bilder bewegen



## Ataraxie (25. Feb 2006)

Ich habe folgende Frage:

Wie kann ich eine Abfolge von Bildern, zum Beispiel eine Laufanimation, schnell über den Bildschirm bewegen?
Bis jetzt werden nach jedem Bild der Animation die Koordinaten De/Inkrementiert. 
Aber ich kann ja schlecht die Animation schneller ablaufen lassen, nur damit sich das Bild angemessen schnell bewegt.


----------



## MPW (25. Feb 2006)

Du koenntest die Pixel um die De/Inkrementiert werden erhoehen, das wird aber ruckeln.

Poste mal deinen Code...eigentlich laeft sowas normaler Weise sehr schnell, bzw. schnell genug.


----------



## Ataraxie (25. Feb 2006)

Kein Problem. 
Die Methode paintPenta() ist die Methode in der die Bewegung initialisert wird. Das getMousePosition dient dazu, dass das Gif die Maus verfolgt. leider sehr langsam. Wenn du möchtest kann ich dir auch die .JAR schicken, damit du dir das mal anschauen kannst,


```
class Zeichner extends Component{
	Graphics window;
	Graphics doubbleBuffer;
	BufferedImage bufferImage;
	Image bgpic;
	Dimension screenSize;
	Thread zeichnerThread;
	GraphicalEnvironment environment;
	MediaTracker tracker;
	Image penta[];
	ImageIcon prePenta[];
	Zeichner(Graphics g,GraphicalEnvironment ge){
		super();
		window=g;
		environment=ge;
		screenSize=Toolkit.getDefaultToolkit().getScreenSize();
		zeichnerThread=Thread.currentThread();
		tracker=new MediaTracker(this);
		initEnvironment();
		initPictures();
		initBufferImage();
	}
	public void initEnvironment(){
		environment.addMouseListener(
			new MouseListener(){
				public void mouseClicked(MouseEvent e){
					if(e.getButton()==e.BUTTON3)
					System.exit(0);
				}
				public void mouseEntered(MouseEvent e){
				}
				public void mouseExited(MouseEvent e){
				}
				public void mousePressed(MouseEvent e){
				}
				public void mouseReleased(MouseEvent e){
				}
			});
	}
	public void initPictures(){
		bgpic= new ImageIcon(ClassLoader.getSystemResource("image/bgpic.jpg")).getImage();
		this.prepareImage(bgpic, this);
		while (((checkImage(bgpic, this) & ALLBITS)!= ALLBITS)) {
        	try{
           		 // Pause, um dem Ladevorgang keine Ressourcen zu nehmen
         		 zeichnerThread.sleep(5);
         	}
         	catch(InterruptedException e) {
         		e.printStackTrace();
         	}
        }
        //Pentagifs initialisieren, damit es aus einer Jar gestartet werrden kann
       prePenta= new ImageIcon[10];
       for(int i=0;i<prePenta.length;i++){
       	String nr=""+(1+i);
       	prePenta[i]=new ImageIcon(ClassLoader.getSystemResource("image/gif/penta"+nr+".GIF"));
       }
	}
	public void loadTracker(){
		penta= new Image[10];
		// Die Bilder werden einem Image zugewiesen und dem Tracker bekannt gemacht. 
		// Dieser erhält zusätzlich noch eine ID zu jedem Bild
		for(int i=0;i<penta.length;i++){
			penta[i]=prePenta[i].getImage();
			tracker.addImage(penta[i],i);
		}
		// Beim Videoplayer soll nun so lange gewartet werden, bis alle Bilder geladen wurden. 
		// Hierfür definiert die Klasse MediaTracker die Methode waitForID(int id):
		for (int i=0; i < penta.length; i++) {
			try{
				tracker.waitForID(i);
			}
			catch (InterruptedException e){
				System.err.println("Error: "+e);
			}
			// Fehlerüberprüfung
			if(tracker.isErrorID(i)){
				Object[] errors = tracker.getErrorsID(i);
				for(int n=0;n<errors.length;n++)
					System.err.println("Debug: "+errors[n]+" errorslength"+errors.length+"imagenumbr"+i);
			}
		}
	}
	public void paintpenta(){
		loadTracker();
		int x=490, y=300;//Startposition des Gifs
		for(int i=0;i<penta.length;i++) {
		    Point p=environment.getMousePosition();// Mouse Position
		    
		    if(x!=p.x-25)	//Bewegung auf der X-Achse (-25 damit das gif das 50x50 beträgt in zentriert zum stehen kommt)
		    	if(x<p.x-25)
		    		x=x+1;
		    	else
		    		x=x-1;
		    if(y!=p.y-25)	//Bewegung auf der X-Achse
		    	if(y<p.y-25)
		    		y=y+1;
		    	else
		    		y=y-1;
			doubbleBuffer.drawImage(penta[i],x,y,this); // Hier wird jedes einzelne Bild des Gifs gezeichnet
			sleepd(35,0);					// Die 35ms Beeinflussen die abspielgeschwindigkeit des gifs
			up2date();
			if(i==penta.length-1)
				i=0;
		}
	}
	public void initBufferImage()
	{	
		// Initialisierung des DoubleBuffers
		if (bufferImage == null){
			bufferImage = new BufferedImage(screenSize.width,screenSize.height, BufferedImage.TYPE_INT_RGB); 
			doubbleBuffer = bufferImage.getGraphics();
		}
		// Hintergrundbild laden
		doubbleBuffer.drawImage(bgpic,0,0,this);
	}
	public void up2date(){
		// Den Buffer auf den Bildschirmausgeben
		window.drawImage(bufferImage,0,0,this);
		doubbleBuffer.drawImage(bgpic,0,0,this);
	}
	public void sleepd(int i,int x){
		try{
         	 zeichnerThread.sleep(i,x);
         }
         catch(InterruptedException e) {
         	e.printStackTrace();
         }
	}
}
class GraphicalEnvironment extends Frame
{  
	GraphicalEnvironment(){
		super("Testzeichnen");
		this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
		this.setUndecorated(true);
		this.setVisible(true);
	}	
}
	class GraphicalEnvironment extends Frame
{  
	GraphicalEnvironment(){
		super("Testzeichnen");
		this.setSize(Toolkit.getDefaultToolkit().getScreenSize());
		this.setUndecorated(true);
		this.setVisible(true);
	}	
}
public class Starter
{
	GraphicalEnvironment ge;
	Zeichner d;
	Starter(){
		ge = new GraphicalEnvironment();
		d = new Zeichner(ge.getGraphics(),ge);	
	}
	public void start(){
		d.paintpenta();
	}
  	public static void main( String args[] ) throws Exception{
  		Starter t=new Starter();
		t.start();
  	}
}
```


----------

