Animation nur einmal durchführen

Crisma

Mitglied
Hallo,

ich habe ein Problem mit meinem folgenden Code. Ich bekomme es einfach nicht hin, dass eine Animation nur ein einziges mal durchgeführt wird, wenn eine Taste gedrückt wird.
Es ist ein simples Spiel, bei dem man ein Raumschiff navigieren kann.
Nun soll es so sein, dass, wenn man nach unten oder oben fliegt, das Schiff sich in eine Schräglage legt, dazu hab ich 5 PNGs, die halt nacheinander abgespielt werden sollen.

Ich bekomme eine Animation hin, wenn man die entsprechende Taste drückt, aber leider nur im Loop.
Vielleicht kann mir ja jemand auf die Sprünge helfen oder hat eine Idee. Ich bin irgendwie gerade blockiert.
Sleep wollte ich eigentlich vermeiden, sollte ich die Animation in eine neue Klasse packen?

Die Klasse Player wird in der Main Klasse im GameLoop aufgerufen, bzw. eben update() und getLook() im Frame.

Grüße,
C.


Hier der Code:
Java:
//package GameOne;

import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.List;

import javax.imageio.ImageIO;

public class Player {
	private float f_xPos, f_yPos;
	private BufferedImage lookAlive, lookDead;
	private BufferedImage[] lookSpaceshipUp = new BufferedImage[5];
	private BufferedImage[] lookSpaceshipDown = new BufferedImage[5];

	// für die animation
	private static final float NEEDANITIME = 0.4f;
	private float aniTime = 0;
	private long timeMillis;

	private boolean isAlive = true;

	public Player(float f_xPos, float f_yPos) {
		this.f_xPos = f_xPos;
		this.f_yPos = f_yPos;

		// Erscheinung des Schiffes
		try {
			DecimalFormat df = new DecimalFormat("00");
			for (int i = 0; i < 5; i++) {
				String fileName = "gfx/spaceship/smallfighter00"
						+ (df.format(i + 1)) + ".png";
				lookSpaceshipUp[i] = ImageIO.read(getClass().getClassLoader()
						.getResourceAsStream(fileName));
			}
			for (int i = 0; i < 5; i++) {
				String fileName = "gfx/spaceship/smallfighter00"
						+ (df.format(i + 7)) + ".png";
				lookSpaceshipDown[i] = ImageIO.read(getClass().getClassLoader()
						.getResourceAsStream(fileName));
			}

			lookAlive = ImageIO.read(getClass().getClassLoader()
					.getResourceAsStream("gfx/spaceship/smallfighter0006.png"));
			lookDead = ImageIO.read(getClass().getClassLoader()
					.getResourceAsStream("gfx/spaceship_dead.png"));
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	public void update(float timeSinceLastFrame) {
		aniTime += timeSinceLastFrame;
		if (aniTime > NEEDANITIME)aniTime = 0;

		// bewegen
		// nach oben
		if (Keyboard.isKeyDown(KeyEvent.VK_W)) {
			f_yPos-=300*timeSinceLastFrame;
		}
		// nach unten
		if (Keyboard.isKeyDown(KeyEvent.VK_S)) {
			f_yPos+=300*timeSinceLastFrame;
		}
		if (Keyboard.isKeyDown(KeyEvent.VK_A))
			f_xPos -= 300 * timeSinceLastFrame;
		if (Keyboard.isKeyDown(KeyEvent.VK_D))
			f_xPos += 300 * timeSinceLastFrame;

	}

	public int getX() {
		return (int) f_xPos;
	}

	public int getY() {
		return (int) f_yPos;
	}

	public BufferedImage getLook() {

		if (!isAlive)
			return lookDead;
		else {
			if (Keyboard.isKeyDown(KeyEvent.VK_S)) {
				return lookSpaceshipDown[4];	
			}
			if (Keyboard.isKeyDown(KeyEvent.VK_W)) {
				return lookSpaceshipUp[0];
			}
			return lookAlive;
		}
	}

}
 
aber selbstverständlich werden Bilder aus den Arrays in der Methode getLook() wieder gegeben, und zwar einmal das fünfte Element eines Arrays und einmal das erste Element eines Arrays. update() ist void, da kommt nix zurück.

Ich hatte ja geschrieben, dass ich eine einmalige Animation nicht hinbekomme, eben nur eine Animation im Loop. Ich hatte ja nicht geschrieben, dass in dem Code eine stattfindet.
Wo das passieren soll, hatte ich vergessen zu erwähnen, hätte jetzt aber gedacht, das wäre nicht nötig.
Das Schiff fliegt mit den Tasten W und S nach oben/unten, da soll es sich dann auch neigen, sprich die Animation einmal durchführen.

Hab inzwischen was hinbekommen, gefällt mir aber noch nicht
Java:
public BufferedImage getLook() {

		if (!isAlive)
			return lookDead;
		else {
			if (Keyboard.isKeyDown(KeyEvent.VK_S)) {
				//hier müsste noch ein wait rein, ca. 100-200ms
				if(counter<5)counter++;
				return lookSpaceshipDown[counter-1];	
			}
			if (Keyboard.isKeyDown(KeyEvent.VK_W)) {
				if(counter<5)counter++;
				return lookSpaceshipUp[counter-1];
			}
			counter=0;
			return lookAlive;
		}
	}
 
ganz einfach gefragt:
Java:
boolean key = true;
do {
if (Keyboard.isKeyDown(KeyEvent.VK_W)) {
key = false;
}
}while (key)


Do-While oder taugt das nix für diesen Zweck?

Die Schleife wird auf Abruf einmal durchlaufen und auf boolsche Variable == false verlassen.
 

Zurück
Oben