Ich bin schon seit einiger Zeit wieder an einem Problem:
Ich will in einer PlayeranimationKLasse eine Animation in einem Thread ausführen lassen.Das Thread wird von einer KeyHandlerKlasse aufgerufen.
-> KeyPressed = start();
...Animieren...
-> KeyReleased = stop();
Allerdings bekomme ich es nicht hin, den Thread, sobald er einmal in der WhileAnimierenSchlaufe ist per Interrupt() zu beenden und die Animation läuft bis zum Schluss zu ende, obwohl ich eben schon vorher die Taste losgelassen habe.
Klasse KeyHandler
Klasse Animation
Wo liegt mein Fehler ?
Ich will in einer PlayeranimationKLasse eine Animation in einem Thread ausführen lassen.Das Thread wird von einer KeyHandlerKlasse aufgerufen.
-> KeyPressed = start();
...Animieren...
-> KeyReleased = stop();
Allerdings bekomme ich es nicht hin, den Thread, sobald er einmal in der WhileAnimierenSchlaufe ist per Interrupt() zu beenden und die Animation läuft bis zum Schluss zu ende, obwohl ich eben schon vorher die Taste losgelassen habe.
Klasse KeyHandler
Java:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyHandler implements KeyListener {
private Data data;
private PlayerAnimation plAnimation;
private int x = 0;
private int y = 0;
private int animationDirec = 0;
private boolean inThread = false;
public KeyHandler(Data data, Spiel spiel) {
this.data = data;
PlayerAnimation plAnimation = new PlayerAnimation(spiel, this);
this.plAnimation = plAnimation;
}
@Override
public void keyPressed(KeyEvent e) {
// UP - Case 2
if (e.getKeyCode() == KeyEvent.VK_UP) {
y -= 2;
data.setAdd_Y(y);
animationDirec = 2;
plAnimation.setAnimationDirec(animationDirec);
if (inThread == false) {
inThread = true;
new Thread(plAnimation).start();
}
}
// DOWN - Case 1
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
y += 2;
data.setAdd_Y(y);
animationDirec = 1;
plAnimation.setAnimationDirec(animationDirec);
if (inThread == false) {
inThread = true;
new Thread(plAnimation).start();
}
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x -= 2;
data.setAdd_X(x);
animationDirec = 3;
plAnimation.setAnimationDirec(animationDirec);
if (inThread == false) {
inThread = true;
new Thread(plAnimation).start();
}
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x += 2;
data.setAdd_X(x);
animationDirec = 4;
plAnimation.setAnimationDirec(animationDirec);
if (inThread == false) {
inThread = true;
new Thread(plAnimation).start();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
for (int i = 0; i <= 1; i++) {
plAnimation.interrupt();
}
}
}
@Override
public void keyTyped(KeyEvent e) {
}
public boolean getInThread() {
return inThread;
}
public void setInThread(boolean inThread) {
this.inThread = inThread;
}
}
Klasse Animation
Java:
import java.util.Timer;
import java.util.TimerTask;
public class PlayerAnimation extends Thread {
private KeyHandler keyHandler;
private Spiel spiel;
private boolean inThread;
private int animationDirec;
private final long threadSleep = 90;
public PlayerAnimation(Spiel spiel, KeyHandler keyHandler) {
this.spiel = spiel;
this.keyHandler = keyHandler;
}
@Override
public void run() {
switch (this.animationDirec) {
case 1:
try {
while (keyHandler.getInThread() == true) {
spiel.curAnim = 1;
Thread.sleep(threadSleep);
spiel.curAnim = 2;
Thread.sleep(threadSleep);
spiel.curAnim =0;
Thread.sleep(threadSleep);
System.out.println("InTHread"+keyHandler.getInThread());
keyHandler.setInThread(false);
}
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
case 2:
try {
while (keyHandler.getInThread() == true ) {
spiel.curAnim = 3;
Thread.sleep(threadSleep);
spiel.curAnim = 4;
Thread.sleep(threadSleep);
spiel.curAnim = 5;
Thread.sleep(threadSleep);
spiel.curAnim = 6;
Thread.sleep(threadSleep);
spiel.curAnim = 7;
Thread.sleep(threadSleep);
spiel.curAnim = 8;
Thread.sleep(threadSleep);
spiel.curAnim = 9;
Thread.sleep(threadSleep);
spiel.curAnim = 10;
Thread.sleep(threadSleep);
spiel.curAnim = 11;
Thread.sleep(threadSleep);
spiel.curAnim = 12;
Thread.sleep(threadSleep);
spiel.curAnim = 13;
Thread.sleep(threadSleep);
spiel.curAnim = 14;
Thread.sleep(threadSleep);
spiel.curAnim = 3;
Thread.sleep(threadSleep);
keyHandler.setInThread(false);
}
break;
} catch (InterruptedException e) {
interrupt();
e.printStackTrace();
}
case 3:
try {
while (keyHandler.getInThread() == true) {
spiel.curAnim = 7;
Thread.sleep(threadSleep);
spiel.curAnim = 8;
Thread.sleep(threadSleep);
spiel.curAnim = 6;
Thread.sleep(threadSleep);
keyHandler.setInThread(false);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
case 4:
try {
while (keyHandler.getInThread() == true) {
spiel.curAnim = 10;
Thread.sleep(threadSleep);
spiel.curAnim = 11;
Thread.sleep(threadSleep);
spiel.curAnim = 9;
Thread.sleep(threadSleep);
keyHandler.setInThread(false);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
/* case 5:
if (spiel.curAnim >= 0 && spiel.curAnim <= 2) {
spiel.curAnim = 0;
} else if (spiel.curAnim >= 3 && spiel.curAnim <= 5) {
spiel.curAnim = 3;
} else if (spiel.curAnim >= 6 && spiel.curAnim <= 8) {
spiel.curAnim = 6;
} else if(spiel.curAnim >= 9 && spiel.curAnim <= 11){
spiel.curAnim = 9;
}*/
}
}
// GETTER/SETTER
public void setAnimationDirec(int animationDirec) {
this.animationDirec = animationDirec;
}
}
Wo liegt mein Fehler ?