我在JFrame
窗口移动图片时遇到了一些问题。以下是代码的外观:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Main extends JFrame implements KeyListener{
Image caitlanImage = new ImageIcon("Caitlan.png").getImage();
Person caitlan = new Person(caitlanImage, "Caitlan", 10, 200, true);
Person jake;
Image jakeImage;
//Background images
Image granadaBackground;
public static void main(String[] args) throws InterruptedException{
new Main();
}
public Main() throws InterruptedException{
setSize(700,300);
setTitle("Project Anniversary");
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
addKeyListener(this);
//Instantiate background images
granadaBackground = new ImageIcon("Granada Background.jpg").getImage();
//Spawn first background
spawnBackground(granadaBackground);
//Spawn initial sprite
spawnSprite(caitlan);
}
public void moveSprite(Person p) throws InterruptedException{ //Method to move a
sprite 10 pixels (BROKEN)
Graphics g = this.getGraphics();
p.setLocation(p.getPosX() + 10, p.getPosY());
g.drawImage(caitlan.getImage(), caitlan.getPosX() + 10,
caitlan.getPosY(), caitlan.getImage().getWidth(null), caitlan.getImage().getHeight(null),
null);
}
public void paint(Graphics g){ //Overridden paint method
}
public void spawnSprite(Person p){ //Method to initially spawn a sprite
Graphics g = this.getGraphics();
g.drawImage(p.getImage(), p.getPosX(), p.getPosY(),
p.getImage().getWidth(null), p.getImage().getHeight(null), null);
}
public void keyPressed(KeyEvent e) { //Method called whenever a key is pressed
if(e.getKeyChar() == new String("d").charAt(0)){
try {
moveSprite(caitlan);
} catch (InterruptedException e1) {
}
}
}
public void spawnBackground(Image backgroundImage){
Graphics g = this.getGraphics();
g.drawImage(backgroundImage, 0, 0, backgroundImage.getWidth(null),
backgroundImage.getHeight(null),null);
}
public void keyReleased(KeyEvent e) { //IGNORE
}
public void keyTyped(KeyEvent e) { //IGNORE
}
}
这里发生的意思是每当按下“d”键时,精灵向右移动10个像素。然而,最终发生的事情是它重新粉刷了10个像素,并且原始图像仍然存在,所以它看起来像一个相当令人作呕的混乱图片在彼此之上。这似乎是一个相当简单的问题,但我如何简单地将精灵移动10个像素!?
答案 0 :(得分:3)
我在您的代码中看到了几个问题,包括:
getGraphics()
来获取Graphics对象。请注意,此对象不会保留。paintComponent(...)
方法,例如JPanel super.paintComponent(...)
方法内的paintComponent(...)
方法。看起来你还没有浏览过Swing图形的教程,如果是这样的话,我建议你这样做没有延迟,你也可以看一下如何在这个上找到动画的很多例子网站,其中一些是由我创建的。
答案 1 :(得分:0)
为了简洁地解决问题,正在发生的事情是你本身并没有重新绘制任何东西。您只是将新图像绘制在旧图像之上,并且图形保持重绘周期。
做一些像:
g.setColor(Color.white); g.fillRect(0,0,的getWidth(),的getHeight());
在您绘制图像之前。将颜色更改为JFrame的背景颜色,使其看起来无缝(我认为它只是getBackgroundColor())。不过,你应该得到一本关于Swing的好书。