Hallo,
ich habe versucht ein Tutorial (von Brotcrunsher) in ein Applet zu packen. Die Klasse Keyboard funktioniert dabei in Eclipse ohne Probleme, aber im Applet will sie überhaupt nicht reagieren.
Im Grunde wird ja in der while Schleife die Update Methode des Players aufgerufen und dort soll ja auf die Eingabe mittels der Keyboard Klasse reagiert werden, es passiert aber nichts.
Kann mir jemand sagen, warum das so ist?
Die “Haupt”-Klasse
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class AppletTest extends Applet implements Runnable, KeyListener {
Thread thread;
int width, height;
boolean pause = false;
String text = "TEST";
boolean running = true;
//static SoundLib soundlib = new SoundLib();
long lastFrame = System.currentTimeMillis();
public Background img;
public Player player;
// Variablen für die Doppelpufferung
private Image dbImage;
private Graphics dbg;
public void init() {
setSize(800, 600);
width = getSize().width;
height = getSize().height;
img = new Background(50, "weltraum.png");
player = new Player(50,50, "raumschiffchen.png");
addKeyListener(this);
/* soundlib.loadSound("boom", "resources/boom.wav");
soundlib.loadSound("shot", "resources/shot.wav");
soundlib.loadSound("soundtrack", "resources/soundtrack.wav");
soundlib.loopSound("soundtrack");
*/
thread = new Thread(this);
thread.start();
}
public void paint(Graphics g) {
g.drawImage(img.getLook(), img.getX(), 0, this);
g.drawImage(player.getLook(), 50, 50, this);
g.setColor(Color.red);
g.drawString(text, 20, 20);
getToolkit().sync();
}
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
char c = e.getKeyChar();
text = text + c;
}
@Override
public void run() {
while (true) {
long thisFrame = System.currentTimeMillis();
float timeSinceLastFrame = ((float) (thisFrame - lastFrame)) / 1000f;
lastFrame = thisFrame;
img.update(timeSinceLastFrame);
player.update(timeSinceLastFrame);
getToolkit().sync();
repaint();
try {
thread.sleep(15);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
public void update (Graphics g)
{
// Initialisierung des DoubleBuffers
if (dbImage == null)
{
dbImage = createImage (this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics ();
}
// Bildschirm im Hintergrund löschen
dbg.setColor (getBackground ());
dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor (getForeground());
paint (dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage (dbImage, 0, 0, this);
}
}```Die Player Klasse
```package de.fts.applets;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.net.URL;
import javax.swing.ImageIcon;
public class Player {
private float posx, posy;
private Image look;
public Player(int x, int y, String name) {
this.posx = x;
this.posy = y;
look = getImage(name);
}
private Image getImage(String name) {
URL imgURL = getClass().getClassLoader().getResource("resources/" + name);
ImageIcon icon = new ImageIcon(imgURL);
return icon.getImage();
}
public Image getLook(){
return look;
}
public void update(float timeSinceLastFrame) {
if(Keyboard.isKeyDown(KeyEvent.VK_W))posy-=300*timeSinceLastFrame;
}
}
```Und die Keyboard Klasse
```package de.fts.applets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Keyboard implements KeyListener {
private static boolean[] keys = new boolean[1024];
public static boolean isKeyDown(int keyCode) {
if (keyCode>=0&&keyCode<keys.length) return keys[keyCode];
else return false;
}
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode>=0&&keyCode<keys.length) keys[keyCode]=true;
}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode>=0&&keyCode<keys.length) keys[keyCode]=false;
}
//unnötig
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
```(Die Background hatte ich mal weggelassen, ist ja nicht von Belang)