2017-02-27 1 views
0

두 이미지를 표시하고 사용자가 왼쪽/오른쪽 화살표 키 (또는 키 a 및 d)를 사용하여 이미지 중 하나를 이동시킬 수있는 애플릿을 만들려고합니다. 밝은면에서는 이미지를 올바르게 가져 왔음을 알았습니다. 프로그램을 실행하면 두 이미지가 모두 표시되기 때문입니다. 그러나 일단 왼쪽 또는 오른쪽 키를 누르면 오류가 즉시 나타나고 이미지가 의도 한대로 움직이지 않습니다. 누군가가 무엇이 잘못되었는지 말할 수 있고 해결해야 할 부분에 대해 자세히 설명하면 큰 도움이 될 것입니다. 미리 감사드립니다.KeyListener를 사용하여 애플릿에서 이미지를 이동하는 방법은 무엇입니까?

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; 
    } 
} 

} 코드와

답변

0

한 가지 문제는 결코 배열 private boolean[] keys을 초기화 없다는 것입니다,하지만 당신은 당신의 이미지의 x 위치를 변경하려고하기 때문에, 부울을 사용하는 것이 매우 비현실적이다 정렬. 대신, 키를 누를 때마다 x 값을 업데이트하면됩니다. 다음과 같이 귀하의 keyPressed 기능은 다음 보이는

: 애플릿이 실제로 이미지를 다시 그려 지도록, 다시 칠 부르는이 방법의 마지막 줄에서

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(); 
} 

.

값을 재설정 할 필요가 없기 때문에 keyReleased 메서드를 비워 둘 수 있습니다. 마지막으로 호출되지 않으므로 update 메서드를 삭제합니다. 코드의 다른 메서드는 수퍼 클래스 또는 인터페이스에 지정되어 있기 때문에 호출됩니다.

관련 문제