2017-02-27 1 views
0

Ich versuche, ein Applet zu machen, das zwei Bilder anzeigt und dem Benutzer erlaubt, einen von ihnen mit den linken/rechten Pfeiltasten (oder Tasten a und d) zu bewegen. Auf der anderen Seite weiß ich, dass ich die Bilder korrekt importiert habe, da beide angezeigt werden, sobald ich das Programm ausgeführt habe. Sobald ich jedoch die linke oder rechte Taste drücke, erscheint ein Fehler und das Bild bewegt sich nicht wie beabsichtigt. Wenn jemand mir sagen könnte, was falsch ist und die Details erklären, was ich reparieren muss, wäre das eine große Hilfe. Danke im Voraus.Wie man Bild in Applet mit KeyListener verschieben?

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 mainClass extends Applet implements KeyListener { 
Image pic1, pic2; 
int x=0, y=0,move=5; 

public void init(){ 
    setSize (1600,1200); 
    pic1 = getImage(getDocumentBase(),"beach king.jpg"); 
    pic2 = getImage(getDocumentBase(),"eye.jpg"); 
    addKeyListener(this); 
} 
public void start(){ 

} 
public void paint(Graphics g){ 
    //setBackground(Color.CYAN); 
    try{Thread.sleep(100);} 
    catch(Exception e){} 
    //going to change position of pic1 
    g.drawImage(pic1, x, y, this); 
    g.drawImage(pic2, 0, 0, this); 
} 

private boolean[] keys; 

public void keyPressed(KeyEvent e) { 
    keys[e.getKeyCode()] = true; 
} 

public void keyReleased(KeyEvent e) { 
    keys[e.getKeyCode()] = false; 
} 
public void keyTyped(KeyEvent e) {} 

public void update() { 
    if(keys[KeyEvent.VK_A] || keys[KeyEvent.VK_LEFT]){ 
     x-=move; 
    } 
    if(keys[KeyEvent.VK_D] || keys[KeyEvent.VK_RIGHT]){ 
     x+=move; 
    } 
} 

}

Antwort

0

Ein Problem mit Ihrem Code ist, dass Sie nie das Array private boolean[] keys, initialisieren aber da Sie nur versuchen, die x-Position des Bildes zu ändern, ist es sehr unpraktisch, eine boolean zu verwenden Array. Aktualisieren Sie den x-Wert nur dann, wenn eine Taste gedrückt wird.

Ihre keyPressed Funktion sieht dann wie folgt aus:

public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_A || e.getKeyCode() == KeyEvent.VK_LEFT) { 
     x-=move; 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_D || e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     x+=move; 
    } 
    this.repaint(); 
} 

In der letzten Zeile dieser Methode Sie repaint nennen, so dass das Applet neu gezeichnet tatsächlich das Bild.

Sie können die Methode keyReleased dann leer lassen, da Sie keinen Wert zurücksetzen müssen. Löschen Sie schließlich Ihre update-Methode, da sie nie aufgerufen wird (die anderen Methoden in Ihrem Code werden aufgerufen, weil sie entweder in der Superklasse oder in der Schnittstelle angegeben sind).