[英]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.