簡體   English   中英

Sprite不在JPanel上移動

[英]Sprite not moving on 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;
    }
}


}

通過覆蓋paintComponent()方法而不是paint()方法來完成自定義繪制。

只有具有焦點的組件才能收到KeyEvent。 您的面板看起來沒有焦點。 在構造函數中,您需要添加:

setFocusable(true);

我對揮桿了解不多,但是您要為每個要繪制的幀調用“ repaint()”嗎? 例如

thePanel.repaint();

如果閃爍,則可能還需要將面板設置為雙緩沖

setDoubleBuffered(true);

希望這些對您有幫助。 如果那不能回答您的問題,也許它會http://docs.oracle.com/javase/tutorial/uiswing/painting/我沒有時間閱讀它,但是我做了略讀,看起來不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM