2013-02-18 114 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