eventhandling: keypressed und keyreleased?

  • Themenstarter Themenstarter thangs_wify
  • Beginndatum Beginndatum
T

thangs_wify

soll für informatik ein jump 'n' run spiel schreiben. bisher habe ich eine testdatei geschrieben, bei der ich austeste, wie alles funktioniert. im moment bin ich beim eventhandling. sowas habe ich noch nie gemacht, daher weiß ich nicht, wie ich es richtig machen soll und im internet hab ich bis jetzt nichts hilfreiches gefunden.
also: ich habe versucht einen pilz(testbild was später der player sein wird) in ein applet auf einen hintergrund zu setzen, was anscheinend so weit auch geklappt hat. jetzt bin ich allerdings dabei, das eventhandling auszuprobieren und das funktioniert nicht. ich möchte, dass der pilz, wenn man die pfeiltasten drückt in die entsprechende richtung wandert. sobald man loslässt oder er den rand des spielfeldes erreicht hat, soll er stehen bleiben.
bitte schaut euch mal meinen code an und sagt mir, was ich falsch gemacht habe. darüber würde ich mich sehr freuen ^-^


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.lang.model.element.ElementVisitor;

public class Hintergrundbild2 extends Applet implements Runnable, KeyListener {
// Initialisierung der Variablen
int x_pos = 30; // x - Position des Balles
int y_pos = 125; // y - Position des Balles
int x_speed = 1; // Geschwindigkeit des Balles in x - Richtung
int y_speed = 0;
int appletsize_x = 350; // Größe des Applets in x - Richtung
int appletsize_y = 300; // Größe des Applets in y - Richtung
int speed;

// Variablen für die Doppelpufferung
private Image dbImage;
private Graphics dbg;
private Thread th;


boolean leftKey = false;
boolean rightKey = false;
boolean upKey = false;
boolean downKey = false;

// Bildvariable für den Hintergrund
Image backImage;
//Bildvariable für den Player
Image player;

public void init() {
setBackground(Color.black);

// Laden der Bilddatei
backImage = getImage(getCodeBase(), "Land.gif");
player = getImage(getCodeBase(), "pilz.gif");

addKeyListener(this);
}

public void start() {
// Schaffen eines neuen Threads, in dem das Spiel läuft
th = new Thread(this);
// Starten des Threads
th.start();
}

public void stop() {
// // Thread stoppen
// th.stop();
// // Thread auf null setzen
// th = null;
}

public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT: leftKey = true;
case KeyEvent.VK_RIGHT: rightKey = true;
case KeyEvent.VK_UP: upKey = true;
case KeyEvent.VK_DOWN: downKey = true;
}
}

public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT: leftKey = false;
case KeyEvent.VK_RIGHT: rightKey = false;
case KeyEvent.VK_UP: upKey = false;
case KeyEvent.VK_DOWN: downKey = false;
}
}

public void keyTyped(KeyEvent e) {
// switch(e.getKeyCode()) {
// case KeyEvent.VK_LEFT: leftKey = true;
// case KeyEvent.VK_RIGHT: rightKey = true;
// case KeyEvent.VK_UP: upKey = true;
// case KeyEvent.VK_DOWN: downKey = true;
// }
}

public void destroy() {

}

public void run() {
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

// Solange true ist läuft der Thread weiter
while (true) {
while(leftKey == true && x_pos < 20){
y_speed = 0;
x_speed = -1;

repaint();

try {
paint(getGraphics());
// Stoppen des Threads für in Klammern angegebenen Millisekunden
Thread.sleep(20);
} catch (InterruptedException ex) {
// do nothing
}
}
while(rightKey == true && x_pos > appletsize_x - 20){
y_speed = 0;
x_speed = +1;

repaint();

try {
paint(getGraphics());
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep(20);
} catch (InterruptedException ex) {
// do nothing
}
}
while(upKey == true && y_pos < appletsize_y -20){
x_speed = 0;
y_speed = +1;

repaint();

try {
paint(getGraphics());
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep(20);
} catch (InterruptedException ex) {
// do nothing
}
}
while(downKey == true && y_pos > 20){
x_speed = 0;
y_speed = -1;

repaint();

try {
paint(getGraphics());
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep(20);
} catch (InterruptedException ex) {
// do nothing
}
}
// Neuzeichnen des Applets
// repaint();
//
// try {
// paint(getGraphics());
// // Stoppen des Threads für in Klammern angegebene Millisekunden
// Thread.sleep(20);
// } catch (InterruptedException ex) {
// // do nothing
// }

// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}

/** 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);
}

public void paint(Graphics g) {
// Zeichnen des Bildes

g.drawImage(backImage, 0, 0, this);

g.setColor (Color.blue);

g.drawImage(player, x_pos - 20, y_pos - 20, 40, 40, this);

}
}
 
Hallo !

Also als erstes fallen mir da die fehlenden breaks bei der switch-case Geschichte auf !

public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT: leftKey = true;break;
case KeyEvent.VK_RIGHT: rightKey = true;break;
case KeyEvent.VK_UP: upKey = true;break;
case KeyEvent.VK_DOWN: downKey = true;
}
}

public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT: leftKey = false;break;
case KeyEvent.VK_RIGHT: rightKey = false;break;
case KeyEvent.VK_UP: upKey = false;break;
case KeyEvent.VK_DOWN: downKey = false;
}
}

Versuchs mal so !
Sonst werden z.B. beim VK_RIGHT-PressedEvent die Flags rightKey,upKey und downKey auf true gesetzt !

Gruß Jadix
 
Hallo,

@all
Nutzt nächstes mal bitte die Code-Tags. Ist in der Toolbar als # gekennzeichnet.
Wenn man dann in diesen Tags das Wort "Code" durch "Java" ersetzt, wird der Code auch noch farblich dargestellt.

MFG

zEriX
 
Zurück