화면에서 움직이는 간단한 스프라이트를 얻으려고합니다. 다른 소스 코드의 지침을 따라했지만 다른 코드의 다른 기능에서 추가 된 일부 복잡성을 제거 했으므로이 코드의 잘못된 점에 대해 머리 숙여 보지 못했습니다. 지금은 화면에서 자유롭게 돌아 다니려고합니다. 나중에 움직이는 동안 애니메이션이 바뀌기를 바랍니다. 두 클래스의 코드는 다음과 같습니다. 스프라이트가 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;
}
}
}
그래서, 분명히 알 수 있듯이 paint() 메소드를 "@Override paintComponent (Graphics g) {}"로 변경해야합니까? 그렇다면 작동하지 않습니다. 생성자에 setFocusable도 추가했습니다. –
이것은 문제를 해결하지 않지만 잘못된 메서드를 재정의합니다 !!! paintComponent()는 사용자 정의 페인팅 로직을 추가해야하는 곳입니다. 맨 위에 super.paintComponent()가 있어야합니다. – camickr