Home
DirectX 8
Java
  • Hello World
  • Konvertierungen
  • Grafik
  • Animation
  • Sounds
  • Stuff
  • Download

    Links


    Kontakt












  • Java Programmierung - Animationen
    • Bilder, Threads und Animation

      zuerst weden wir mal eine Grafik Laden.

      Dies geschieht mit folgender Methode:
      getImage(URL Adresse ,String Name)

      URL Adresse ist der Pfad zu Datei. Beispiel: http:/www.lokalnetz.de/java/grafik/
      Mit der Methode getDocumentBase() bekommt man den URL des Apllets heraus.
      String Name die Datei. Beispiel: duke.gif

      Die getImage- Methode lädt das Bild leider nicht direkt sondern erst
      sobald es gezeichnet werden soll.
      Um dies zu verhindern benötigen wir das Media-Tracker-Objekt.

      Dazu erzeugen wir zuerst ein Meditracker Object:
      MediaTracker tracker = new MediaTracker(this);

      Danach müssen wir dem Tracker mitteilen welche Grafik er laden soll und welche id es erhält.
      tracker.addImage(image,0);
      Damit wir auf diese Grafik warten verwenden wir die waitForID Methode des Trackers.
      Diese Methode kann eine Exception werfen daher müssen wir einen try/catch Block konstruieren.

      Das ganze könnte dann in einer Methode so aussehen:
      	public Image LadeBild(String BildName)
      	{
      		Image bild;
      		MediaTracker tracker;
      
      		bild=getImage(getDocumentBase(),BildName);
      
      		tracker = new MediaTracker(this);
      		tracker.addImage(bild,0);
      		try
      		{
      			tracker.waitForID(0);
      		} catch (InterruptedException e) {}
      		return bild;
      	}
      	

      Eingebunden in einem Applet:
      	import java.awt.*;
      	import java.applet.*;
      
      	public class ani_a extends Applet
      	{
      		private int mx,my;
      		private Image Buffer;
      		private Graphics zBuffer;
      
      		private Image bild_duke;	
      
      
      		public Image LadeBild(String BildName)
      		{
      			Image bild;
      			MediaTracker tracker;
      
      			bild=getImage(getDocumentBase(),"grafik/"+BildName);
      
      			tracker = new MediaTracker(this);
      			tracker.addImage(bild,0);
      			try
      			{
      				tracker.waitForID(0);
      			} catch (InterruptedException e) {}
      			return bild;
      		}
      
      		public void update(Graphics g)
      		{
      			paint(g);
      		}
      
      		public void init()
      		{
      			Buffer=createImage(size().width,size().height);
      			zBuffer=Buffer.getGraphics();
      		
      			// Duke Laden
      			bild_duke=LadeBild("duke.gif");
      		}
      
      
      		public void paint(Graphics g)
      		{		
      			zBuffer.drawImage(bild_duke,0,0,this);
      
      			g.drawImage(Buffer,0,0,this);
      		}	
      	}
      	
      Hier nun das Beispiel in Aktion:


      Um eine Animation zu erstellen benötigen wir einen Thread. Ein Thread hat den Vorteil das keine unregelmäßigkeiten beim Neuzeichnen auftreten. Das Applet wird mit einem Thread immer in derselben Geschwindigkeit animiert und läuft flüssiger als ohne.
      Noch dazu kann ein Thread parallel zu anderen Threads ausgeführt werden.

      Threads erstellen:
      	import java.awt.*;
      	import java.applet.*;
      
      	public class ani_thread extends Applet implements Runnable
      	{
      		private int mx,my,dx,dy,richtung;
      
      		private Image Buffer;
      		private Image bild_duke;	
      
      		private Graphics zBuffer;
      		Thread Anim;
      	
      
      		public void start()
      		{
      			if (Anim==null)
      			{
      				Anim = new Thread(this);
      				Anim.start();
      			}
      		}
      
      		public void stop()
      		{
      			if (Anim!=null)
      			{
      				Anim.stop();
      				Anim = null;
      			}
      		}
      
      		public void run()
      		{
      			while(true)
      			{
      				try
      				{
      					Thread.sleep(15);
      				}
      				catch (Exception e)
      				{
      	
      				}
      				repaint();
      			}
      		}
      	
      
      		public Image LadeBild(String BildName)
      		{
      			Image bild;
      			MediaTracker tracker;
      
      			bild=getImage(getDocumentBase(),"grafik/"+BildName);
      
      			tracker = new MediaTracker(this);
      			tracker.addImage(bild,0);
      			try
      			{
      				tracker.waitForID(0);
      			} catch (InterruptedException e) {}
      			return bild;
      		}
      
      		public void update(Graphics g)
      		{
      			paint(g);
      		}
      
      		public void init()
      		{
      			/// Buffer erstellen
      			Buffer=createImage(size().width,size().height);
      			zBuffer=Buffer.getGraphics();
      		
      			/// Duke Laden
      			bild_duke=LadeBild("duke.gif");
      
      			dx=10;dy=0;		
      		}
      
      
      		public void paint(Graphics g)
      		{		
      
      			zBuffer.setColor(Color.white);				
      			/// Hintergrund mit weiß löschen
      			zBuffer.fillRect(0,0,size().width,size().height);
      		
      			/// Duke bewegen nach rechts oder links
      			if (richtung==1)
      			{
      				dx=dx+1;
      			}
      			else
      			{
      				dx=dx-1;
      			}
      			if (dx>180)
      			{
      				richtung=0;	
      			}
      
      			if (dx<0)
      			{
      				richtung=1;	
      			}
      		
      			/// Duke in den Buffer zeichnen 
      			zBuffer.drawImage(bild_duke,dx,dy,this);
      
      			/// Buffer zeichnen 
      			g.drawImage(Buffer,0,0,this);
      		}	
      	}	
      	

      Um überhaupt eine Thread-fähige Klasse zu erhalten brauchen wir das Runnbale Interface.
      Dieses wird in der Klassendefinition implementiert:
      public class ani_thread extends Applet implements Runnable

      Das Runnable-Interface hat nur eine Methode und das ist die run-Methode.
      Diese Methode wird ausgeführt sobald ein Thread läuft.

      Zuerst wird ein Thread erzeugt: (in der start-Methode)
      Anim = new Thread(this);

      Der THIS-Operator teil dem Thread-Objekt mit das es die run-Methode
      der Applet-Klasse benutzen soll.

      Dann wird er gestartet:
      Anim.start();

      Nun wird die run-Methode aufgerufen die eine Endlosschleife enthält, die nur 2 Dinge macht:
      15 Millisekunden warten und dann neuzeichnen.Und das endlos oft.

      In der paint-Methode wird dann die Position und Richtung des Dukes verändert.

      Hier nun das Beispiel in Aktion: