Sprite没有在JPanel上移动

时间:2013-02-18 16:01:11

标签: java sprite keylistener

我正试图在屏幕上移动一个简单的精灵。我无法理解这段代码的错误,因为我遵循了不同源代码的说明,但删除了其他代码中其他功能添加的一些复杂性。 现在我只想让它在屏幕上自由移动。 后来我打算让动画在移动时改变。 这两个类的代码如下。

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


}

2 个答案:

答案 0 :(得分:0)

自定义绘制是通过覆盖paintComponent()方法而不是paint()方法完成的。

KeyEvents仅由具有焦点的组件接收。它看起来不像你的面板有焦点。在构造函数中,您需要添加:

setFocusable(true);

答案 1 :(得分:0)

我不知道有很多关于挥杆的内容,但是你是否想要为你想要的每一帧画出“重绘()”?例如

thePanel.repaint();

如果它闪烁,您可能还想将面板设置为双缓冲

setDoubleBuffered(true);

我希望无论如何都会帮助你。如果这不能回答你的问题,也许这会http://docs.oracle.com/javase/tutorial/uiswing/painting/我没有时间阅读它,但我确实略过了它看起来很好。

相关问题