2013-02-18 2 views
0

화면에서 움직이는 간단한 스프라이트를 얻으려고합니다. 다른 소스 코드의 지침을 따라했지만 다른 코드의 다른 기능에서 추가 된 일부 복잡성을 제거 했으므로이 코드의 잘못된 점에 대해 머리 숙여 보지 못했습니다. 지금은 화면에서 자유롭게 돌아 다니려고합니다. 나중에 움직이는 동안 애니메이션이 바뀌기를 바랍니다. 두 클래스의 코드는 다음과 같습니다. 스프라이트가 JPanel에서 이동하지 않습니다.

package game; 

import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.JPanel; 
import javax.swing.Timer: 

public class Game extends JPanel implements ActionListener { 

int x, y, b_width, b_height; 
Player player; 
     Timer timer; 

public Game() { 
    addKeyListener(new KeyRecorder()); 
    player = new Player(); 

       timer = new Timer(5, this); 
       timer.start(); 
} 

public void paint(Graphics g){ 
    g.drawImage(player.image, player.getX(), player.getY(), this); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    player.move(); 
    repaint(); 
} 

public class KeyRecorder extends KeyAdapter{ 
    public void keyPressed(KeyEvent e){ 
     player.keyPressed(e); 
     repaint(); 
    } 
    public void keyReleased(KeyEvent e){ 
     player.keyReleased(e); 
    } 
} 

} 

그리고 스프라이트 :

package game; 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.KeyEvent; 

import javax.swing.ImageIcon; 

public class Player { 

private String sprite = "sprite.png"; 
int x, y, dx, dy; 
int width, height; 
Image image; 

public Player() { 
    ImageIcon ii = new ImageIcon(this.getClass().getResource(sprite)); 
    image = ii.getImage(); 

} 

public int getX(){ 
    return x; 
} 

public int getY(){ 
    return y; 
} 

public void move() { 
    x = x + dx; 
    y = y + dy; 
} 

public void keyPressed(KeyEvent e){ 
    int key = e.getKeyCode(); 

    if(key == KeyEvent.VK_UP){ 
     dy -= 3; 
    } 
    if(key == KeyEvent.VK_DOWN){ 
     dy += 3; 
    } 
    if(key == KeyEvent.VK_LEFT){ 
     dx -= 3; 
    } 
    if(key == KeyEvent.VK_RIGHT){ 
     dx += 3; 
    } 
} 

public void keyReleased(KeyEvent e){ 
      int key = e.getKeyCode(); 

    if(key == KeyEvent.VK_UP){ 
     dy -= 0; 
    } 
    if(key == KeyEvent.VK_DOWN){ 
     dy += 0; 
    } 
    if(key == KeyEvent.VK_LEFT){ 
     dx -= 0; 
    } 
    if(key == KeyEvent.VK_RIGHT){ 
     dx += 0; 
    } 
} 


} 

답변

0

사용자 정의 그림이의 paintComponent() 메소드가 아닌 paint() 메소드를 재정 의하여 수행된다.

키 이벤트는 포커스가있는 구성 요소에 의해서만 수신됩니다. 패널에 포커스가있는 것처럼 보이지 않습니다.

setFocusable(true); 
+0

그래서, 분명히 알 수 있듯이 paint() 메소드를 "@Override paintComponent (Graphics g) {}"로 변경해야합니까? 그렇다면 작동하지 않습니다. 생성자에 setFocusable도 추가했습니다. –

+0

이것은 문제를 해결하지 않지만 잘못된 메서드를 재정의합니다 !!! paintComponent()는 사용자 정의 페인팅 로직을 추가해야하는 곳입니다. 맨 위에 super.paintComponent()가 있어야합니다. – camickr

0

내가 스윙에 대한 엄청난 양의 모르겠지만, 당신은 당신이 그려 할 모든 프레임에 대해 ") (칠"호출 : 생성자에서 당신은 추가 할 필요가?

thePanel.repaint(); 

이 깜박 경우 예를

를 들어, 당신은 또한 내가 그 어쨌든 당신이 도움이되기를 바랍니다
setDoubleBuffered(true); 

을 이중 버퍼링 할 패널을 설정할 수 있습니다. 그게 당신의 질문에 대답하지 않으면, 아마도 이것은 http://docs.oracle.com/javase/tutorial/uiswing/painting/ 내가 그것을 읽을 시간이 없지만 나는 그것을 훑어 보았고 그것은 좋아 보인다.

+0

그래, 키를 누를 때마다 다시 칠해 야 해. 감사합니다. 제공 한 링크를 살펴 보겠습니다. –

+0

정확히 무엇이 문제입니까? 스프라이트는 한 번 그리기 만하고 그 후에는 움직이지 않거나 전혀 그리지 않습니까? – Fiachra

+0

죄송합니다. 처음에는 코드를 많이 보지 않았으며, Camickr이 말한 것처럼 패널에 포커스가 없을 수도 있습니다. 메서드가 실제로 호출되었는지 확인하기 위해 수행 된 중단 점을 설정해 보았습니까? – Fiachra