# Animation



## matthew (26. Feb 2010)

Hallo, ich habe vor etwa 4 Monaten mit Java Programmierung angefangen und auch bissel rumexperimentiert und bin jetzt bei Grafiken und Animation angekommen. Also mein Problem ist folgendes: Ich habe halt durch google und Tutorials bloss erfahren wie man Images animieren kann aber irgendwie krieg ich das nicht mit meinen eigenen Grafiken hin die ich mit hilfe von AWT oder auch swing versuche zu zeichnen. Ich habe auch einen kleinen Fullscreenwindow gebastelt und das flakern eliminiert mit hilfe eines Tutorial aber eben die Animation eines Grafik objekt das ich selber zeichne in Java bekomme ich irgendwie nicht hilf. Würde mich freuen wenn mir jemand das genauer erklären kann was ich falsch mache.

Hier mein jetztiges Programm:

Also meiner Meinung nach sollte alles funktionieren bis auf die Animationsklasse.


```
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

import javax.swing.JFrame;




public class Main extends JFrame{

	private ScreenManager s;
	
	private Animation a;
	
	public static void main(String[] args) {
		
		DisplayMode dm = new DisplayMode(1024, 768, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
		Main m = new Main();
		m.run(dm);
		
	}
	
	public void run(DisplayMode dm){
		setBackground(Color.BLACK);
		setForeground(Color.WHITE);
		setFont(new Font("Arial", Font.PLAIN, 24));
		
		s = new ScreenManager();
		
		try{
			s.setFullScreen(dm, this);
			try{
				Thread.sleep(5000);
			}catch(Exception ex){}
		}finally{
			s.restoreScreen();
		}
	}
	
	public void paint(Graphics g){
		Graphics gi = image.getGraphics();
		image.getGraphics().drawString("This is gonna be awesome", 200, 200);
		
		
		gi.drawString("This is gonna be lame", 200, 200);
		
		a = new Animation();
		
		// This is gonna be awesome string wird übermittelt
		a.addScene(gi, 250);
		// This is gonna be lame string wird übermittelt
		a.addScene(gi, 250);
	}
	
}
```


```
import java.awt.*;
import javax.swing.JFrame;

public class ScreenManager {
	
	private GraphicsDevice vc;
	
	public ScreenManager(){
		GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
		vc = env.getDefaultScreenDevice();
	}
	
	public void setFullScreen(DisplayMode dm, JFrame window){
		window.setUndecorated(true);
		window.setResizable(false);
		vc.setFullScreenWindow(window);
		
		if(dm != null && vc.isDisplayChangeSupported()){
			try{
				vc.setDisplayMode(dm);
				
			}catch(Exception e){}
		}
		
	}
	
	public Window getFullScreenWindow(){
		return vc.getFullScreenWindow();
	}
	
	public void restoreScreen(){
		Window w = vc.getFullScreenWindow();
		if(w != null){
			w.dispose();
		}
		vc.setFullScreenWindow(null);
	}
	
}
```


```
import java.util.ArrayList;
import java.awt.Graphics;
public class Animation {
	
	private ArrayList scenes;
	private int sceneIndex;
	private long movieTime;
	private long totalTime;
	
	public Animation(){
		scenes = new ArrayList();
		totalTime = 0;
		start();
	}
	
	public synchronized void addScene(Graphics g, long t){
		totalTime += t;
		scenes.add(new OneScene(g, totalTime));
	}
	public synchronized void start(){
		movieTime = 0;
		sceneIndex = 0;
	}
	
	public synchronized void update(long timePassed){
		if(scenes.size() > 1){
			movieTime += timePassed;
			if(movieTime >= totalTime){
				movieTime = 0;
				sceneIndex = 0;
			}
			while(movieTime > getScene(sceneIndex).endTime){
				sceneIndex++;
			}
		}
	}
	public synchronized Graphics getGraphic(){
		if(scenes.size() == 0){
			return null;
		}else{
			return getScene(sceneIndex).gr;
		}
	}
	
	private OneScene getScene(int x){
		return(OneScene)scenes.get(x);
	}
	
	private class OneScene{
		Graphics gr;
		long endTime;
		
		public OneScene(Graphics gr, long endTime){
			this.gr = gr;
			this.endTime = endTime;
		}
	}
}
```


----------



## Steev (26. Feb 2010)

Hi matthew ,

da sind noch ein paar Böcke drin:
1. Wieso um alles in der Welt erstellst du pro zeichnung ein neues Animationsobjekt??? Das sind ja bis zu 100 Objekte pro Sekunden!!!
2. Was für eine Funktion hat die Animationsklasse??? Man kann Grafikobjekte nicht speichern, Grafikobjekte sind flüchtig und müssen per Referenz an untergeordnete Methoden weitergeleitet werden.

Unter diesem Link findest du ein kleines KSKB zum ansehen.
http://www.java-forum.org/attachmen...355-frage-huetchenspielprogrammierung-hat.zip


----------



## André Uhres (26. Feb 2010)

Hier ist eine Einführung in das Malen mit Swing: Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki


----------



## matthew (6. Mrz 2010)

Also erstmal danke für die schnelle Antwort. Ich habe mir dieses Hatspiel mal angesehen und studiert und auch die Seite über zeichnen mit swing und awt. Dabei bin ich zu folgendem Ergebnis gekommen und komme hier nicht mehr weiter, ich habe es nach der vorlage von dem Hatspiel aufgebaut aber irgendwie bewegt sich das Graphics objekt nur hin und her aber nicht flüssig von Punkt A zu Punkt B:


```
import java.awt.Color;
import java.awt.Graphics;

public class Note {
	
	
	private static final long serialVersionUID = 1L;
	private int           x          = 600;
    private int           rand         = 200;
    
    public int getX() {
        return x;
    }

    public void paint(Graphics g) {
           g.setColor(Color.BLACK);
           g.fillOval(x, 200, 30, 40);
    	
    }

    public int getRand() {
        return rand;
    }

    public void setX(int x) {
        this.x = x;
    }
}
```


```
import java.awt.Graphics;
import javax.swing.JPanel;


public class NotenGamePanel extends JPanel implements Runnable {
	private static final long serialVersionUID  = 3417260400929981558L;


    private int  SPEED             = 3;
    private boolean EndLoop = false;
    private Note               note = new Note();

    public NotenGamePanel() throws Exception {
        new Thread(this).start();

    }

    public void run() {
// ich weiss es ist momentan noch eine endlosschleife sollte es aber nicht beeinflussen
    	while (!EndLoop) {
    		
        try {
        	 update();
         	repaint();
        	
            Thread.sleep(10);
        } catch (Exception e) {
        }
    }
    }

    private void update() {
		if (note.getX() - SPEED >= note.getRand()){
			note.setX(getX() - SPEED);
		} else {
			note.setX(600);
		}
	}
    
    
    public void paintComponent(Graphics g){
    	super.paintComponent(g);
    	
    	note.paint(g);
    }
}
```


```
import java.awt.Dimension;

import java.awt.Toolkit;
import javax.swing.JFrame;



public class NotenGame extends JFrame {
	public static void main(String[] args) {
        NotenGame game = new NotenGame("NoteGame");
        game.setVisible(true);
    }


private static final long serialVersionUID = 8013474420287224267L;

private NotenGamePanel      ga               = null;

public NotenGame(String title) {
    super(title);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Toolkit tk = Toolkit.getDefaultToolkit();
    Dimension d = tk.getScreenSize();
    setSize(640, 480);
    setLocation((d.width - getWidth()) / 2, (d.height - getHeight()) / 2);
    try {
        ga = new NotenGamePanel();
        add(ga);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}
```


----------



## André Uhres (6. Mrz 2010)

note.setX(note.getX() - SPEED);


----------



## matthew (7. Mrz 2010)

Achso ja jetzt funktioniert es. Ich hasse so kleine flüchtigkeits Fehler und dann werden sie nichtmal angezeigt. xD Habe die ganze Zeit bei meiner paint Methode gesucht.


----------

