2013-02-18 69 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); 
    } 
} 

} 

以及sprite:

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()方法来完成。

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

setFocusable(true); 
+0

所以,我们很清楚,是否应该将paint()方法更改为“@Override paintComponent(Graphics g){}”?如果是这样,它不起作用。我也在构造函数中添加了setFocusable – 2013-02-18 16:49:27

+0

这不会解决您的问题,但是您重写了错误的方法! paintComponent()是你应该添加自定义绘画逻辑的地方。你还应该在顶部有一个super.paintComponent()。 – camickr 2013-02-18 20:27:41

0

我不知道左右摇摆,数额巨大,但你叫“重绘()”你想得出每一帧?例如

thePanel.repaint(); 

如果它闪烁,你可能还需要设置面板​​双缓冲

setDoubleBuffered(true); 

我希望这些可以帮助你啦。如果这不能回答你的问题,也许这将是http://docs.oracle.com/javase/tutorial/uiswing/painting/我没有时间阅读,但我确实浏览了它,它看起来不错。

+0

是的,每次按下某个键时我都会重新绘制它。谢谢,我会看看你提供的链接。 – 2013-02-18 16:47:14

+0

究竟是什么问题?精灵会画一次而不是在那之后移动或者根本不绘制? – Fiachra 2013-02-18 16:53:50

+0

对不起,我承认我没有像最初那样仔细查看代码,并且camickr说可能是因为你的面板没有焦点。你有没有尝试设置一个actionperformed的断点来查看该方法是否真的被调用? – Fiachra 2013-02-18 16:57:27