Animation in eigenen Thread auslagern.....

kaoZ

Top Contributor
Aloha,

ich steh grad aufm Schlauch, ich habe folgende Klasse erstellt welche eine Animation darstellt,

Java:
public class Animation implements Drawable{

	private int x;
	private int y;
	private int currentTile;
	private int tileSize;
	private int lastTile;
	
	private String name;
	
	private boolean started;
	
	private BufferedImage tileSet;
	private BufferedImage[] tiles;
	
	public Animation(String name, String source, int tileSize){
		this.name = name;
		this.tileSize = tileSize;
		loadImage(source);
		createTiles();
	}
	
	public Animation(String name, BufferedImage tileSet, int tileSize){
		this.name = name;
		this.tileSet = tileSet;
		this.tileSize = tileSize;
		createTiles();
	}
	
	public Animation(String name, BufferedImage tileSet, int x, int y, int tileSize){
		this.name = name;
		this.tileSet = tileSet;
		this.tileSize = tileSize;
		createTiles(x, y);
	}
	
	private void loadImage(String source){
		try {
			tileSet = ImageIO.read(getClass().getResourceAsStream(source));
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void createTiles(){
		tiles = new BufferedImage[tileSet.getWidth() / tileSize];
		for (int i = 0; i < tiles.length; i++) {
			tiles[i] = tileSet.getSubimage(i * tileSize, 0, tileSize, tileSize);
		}
	}
	
	private void createTiles(int x, int y){
		tiles = new BufferedImage[tileSet.getWidth() / tileSize];
		for (int i = 0; i < tiles.length; i++) {
			tiles[i] = tileSet.getSubimage(x, y, tileSize, tileSize);
		}
	}
	
	public void setFirstTile(int tile){
		if(tile < 0 || tile > tiles.length) {
			throw new ArrayIndexOutOfBoundsException(tile);
		}
		else{
			currentTile = tile;
		}
	}
	
	public void setLastTile(int tile){
		if(tile < currentTile || tile < 0) {
			throw new IllegalArgumentException("tile have to be > as" + currentTile);
		}
		else{
			lastTile = tile;
		}
	}
	
	public void start(){
		this.started = true;
	}
	
	public void stop(){
		this.started = false;
	}
	
	public void setPosition(int x, int y){
		this.x = x;
		this.y = y;
	}
	
	public void setStatic(int tile){
		setFirstTile(tile);
		setLastTile(tile);
	}
	
	@Override
	public void update(){
		if(started) {
			currentTile++;
			if(lastTile == 0) {
				if(currentTile == tiles.length) {
					currentTile = 0;
				}
			}
			else{
				if(currentTile == lastTile) {
					currentTile = 0;
				}
			}
		}
	}

	@Override
	public void draw(Graphics g){
		for (int i = 0; i < tiles.length; i++) {
			g.drawImage(tiles[currentTile], x, y, null);
		}
	}
	
	public int getX()				{return x;}
	public int getY()				{return y;}
	public int getTileSize()		{return tileSize;}
	public String getName()			{return name;}
	public boolean isStarted()		{return started;}

}

funktioniert auch reibungslos, allerdings nur wenn ich diese direkt in einem loop zeichnen lasse, füge ich z.B einem Spieler eine Animation hinzu, und lasse diese dann in der Klasse player zeichnen, dessen instanz wiederum im gameloop gezeichnet wird, wird zwar das image gezeichnet nicht aber die abfolge der bilder, sprich ich muss dazu übergehen die Animation in einen eigenen Thread auszulagern, welche solange das started flag gesetzt ist, eben zeichnet, was sie zeichnen soll,

wie würdet ihr da vorgehen ? Timer + TimerTask? ( für ein ggf. später hinzugefügtes delay) oder einen einfachen Thread mit loop ?

wie verhält sich das ganze dann in Verbindung mit dem EDT ? der ja letzendlich zeichnet, muss ich die Threads dann per join zusammenführen ?

über jeden hinweis bin ich dankbar :)

EDIT:
Mich verwundet gerade das immer nur das erste bild gezeichnet wird, auch wenn ich ein anderes image aus dem BufferedImge array als startimage setze..... sobald ich in einer konkreten klasse eine animation hinzufüge....vielleicht übersehe ich auch gerade auch einfach was....

die konkreten klassen sind btw. die einzigen die eine Implementierung für das Drawable interface bieten...

übersehe ich ggf. gerade nur ein polymorphie problem ?!

Java:
public class Mage extends Player{

	Animation walk;
	
	public Mage(String name){
		super(name);
		setTileSet("/images/playable/mage.png");
		init();
	}
	
	@Override
	protected void init(){
		walk = new Animation("walk", getTileSet(), 0, 0, 64);
		walk.setFirstTile(4);
		walk.start();
	}
	
	@Override
	public void update(){
		walk.setPosition(getX(), getY());
		walk.update();
	}

	@Override
	public void draw(Graphics g){
		walk.draw(g);
	}

}

hier noch die stelle an der dann gerendert wird :

Java:
Player player;

...
	
      	
	private void init(){
		image = new BufferedImage(WIDTH * SCALE, HEIGHT * SCALE, BufferedImage.TYPE_INT_RGB);
		running = true;
		player = new Mage("Merlin");
		player.setPosition(50, 50);
	}
	

	private void update(){
		player.update();
	}
	
	private void render(){
		Graphics2D g = (Graphics2D)image.getGraphics();

		clearScreen(g);

		player.draw(g);
		
		g.dispose();
	}

EDIT:
ich habs , anscheinend liegt es am überladenen konstruktor , dieser initialisiert anschienend doch nicht korrekt insofern ich ein bufferedimage und x und y koordinaten übergebe.... ich meld mich wenn ich eine lösung habe.


ich habs ..... ich brain.....NOT

Verkackt würde ich sagen ^^

Java:
private void createTiles(int x, int y){
		tiles = new BufferedImage[tileSet.getWidth() / tileSize];
		for (int i = 0; i < tiles.length; i++) {
			tiles[i] = tileSet.getSubimage(x, y, tileSize, tileSize);  // <<-- x und y gehören da nicht hin.....
		}
	}

Lösung falls es wen interessiert ist (noch unoptimiert):

Java:
	private void createTiles(int x, int y){
		BufferedImage subImage = tileSet.getSubimage(x, y, tileSet.getWidth(), tileSet.getHeight());
		tiles = new BufferedImage[subImage.getWidth() / tileSize];
		for (int i = 0; i < tiles.length; i++) {
			tiles[i] = subImage.getSubimage(i * tileSize, 0, tileSize, tileSize);
		}
	}
 
Zuletzt bearbeitet:

Androbin

Bekanntes Mitglied
Hallo kaoZ,

ich weiß, es ist ziemlich mühselig, aber:

Versuche doch mal, so zu tun, als wärst du der Java-Interpreter
und gehe dein Programm Schritt für Schritt durch ...
(Du kannst dir auch die Werte der Variablen notieren)

Ich weiß, das klingt jetzt vielleicht etwas bescheuert,
aber wenn man(n) einfach nicht mehr weiterkommt,
ist das manchmal der letzte Ausweg ...

Frohes Schaffen, Androbin
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Minecraft Casino EinarmigerBandit Animation Spiele- und Multimedia-Programmierung 5
B Animation Spiele- und Multimedia-Programmierung 4
Meeresgott Morph Targets und Skeleton Animation Spiele- und Multimedia-Programmierung 2
J (Libgdx) animation nur einmal in einem Event aufrufen Spiele- und Multimedia-Programmierung 1
N Animation funktioniert icht wie sie soll Spiele- und Multimedia-Programmierung 10
K Animation fliegendes JLabel Spiele- und Multimedia-Programmierung 1
R [LWJGL] Skeletal Animation Spiele- und Multimedia-Programmierung 5
F [LWJGL] Skeletal Animation 3D Spiele- und Multimedia-Programmierung 1
R Animation mit Interpolator starten wenn Key pressed Spiele- und Multimedia-Programmierung 0
S Animation zieht "Spur" hinter sich her Spiele- und Multimedia-Programmierung 2
H [ANIMATION] Hintergrundbild nur einmal zeichnen Spiele- und Multimedia-Programmierung 3
A LwJGL - Animation Stockt Spiele- und Multimedia-Programmierung 5
0 Sprung Animation Spiele- und Multimedia-Programmierung 10
M [Java3D] Animation von mehreren Objekten Spiele- und Multimedia-Programmierung 7
C Java3D Interaktion während Animation Spiele- und Multimedia-Programmierung 3
StrikeTom .gif animation als image abspielen Spiele- und Multimedia-Programmierung 2
G [Java3D] Probleme bei Animation Spiele- und Multimedia-Programmierung 4
baddestpoet Animation startet bei gedrückter Taste immer wieder von vorn Spiele- und Multimedia-Programmierung 12
M Animation Spiele- und Multimedia-Programmierung 5
aze Animation an TransformGroup anpassen Spiele- und Multimedia-Programmierung 5
S Animation mit repaint Spiele- und Multimedia-Programmierung 2
K "Animation" funktioniert nur bedingt. Spiele- und Multimedia-Programmierung 8
W Flüssige Animation Spiele- und Multimedia-Programmierung 8
B Animation durch Button auslösen Spiele- und Multimedia-Programmierung 2
J Animation hinter transparentem Bild auf der GlassPane Spiele- und Multimedia-Programmierung 6
D Problem mit Animation bei Little Fighter Spiele- und Multimedia-Programmierung 5
R Double Buffering in Animation ich bekomms einfach nicht hin? Spiele- und Multimedia-Programmierung 3
G GL4Java Animation erstellen Spiele- und Multimedia-Programmierung 2
T Geschwindigkeit einer Animation aendern Spiele- und Multimedia-Programmierung 6
S 3ds animation einbinden Spiele- und Multimedia-Programmierung 3
A Animation mit jmonkeyengine Spiele- und Multimedia-Programmierung 10
S Gif Animation aus Prog heraus erstellen Spiele- und Multimedia-Programmierung 11
C Eigenen Fragment-Shader schreiben Spiele- und Multimedia-Programmierung 1
J Perfomance Probleme beim eigenen Editor Spiele- und Multimedia-Programmierung 1
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
B String zu Objekt einer eigenen Klasse casten Spiele- und Multimedia-Programmierung 13
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
gamebreiti Daemon Thread Spiele- und Multimedia-Programmierung 4
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben