在java中移动后删除图像
在移动图像后,我很难处理图像的删除 首先,我有我的MovingPrite课程,它使董事会: 公共类MovingPriteex扩展了JFrame{在java中移动后删除图像,java,swing,jpanel,awt,paintcomponent,Java,Swing,Jpanel,Awt,Paintcomponent,在移动图像后,我很难处理图像的删除 首先,我有我的MovingPrite课程,它使董事会: 公共类MovingPriteex扩展了JFrame{ private static final long serialVersionUID = 1L; public MovingSpriteEx() { initUI(); } private void initUI() { add(new Board()); setTitle("Moving sprite&
private static final long serialVersionUID = 1L;
public MovingSpriteEx() {
initUI();
}
private void initUI() {
add(new Board());
setTitle("Moving sprite");
setSize(500,400);
setLocationRelativeTo(null);
System.out.println("calling");
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
MovingSpriteEx ex = new MovingSpriteEx();
ex.setVisible(true);
});
}
}
我的Board类正在使用paintComponent从太空船类中绘制,如下所示:
公共类板扩展JPanel实现ActionListener{
private static final long serialVersionUID = 1L;
private Timer timer;
private Spaceship ship;
private final int DELAY = 10;
private boolean incrementX = true;
private boolean incrementY=true;
public Board() {
initBoard();
}
private void initBoard() {//building the frame
addKeyListener(new TAdapter());//listens to the KeyAdapter that can read on the keyboards input
setBackground(Color.black);
setFocusable(true);
ship = new Spaceship();
timer = new Timer(DELAY,this);
timer.start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
doDrawing(g);
Toolkit.getDefaultToolkit().sync();
}
private void doDrawing(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(ship.getImage(),ship.getX(), ship.getY(), this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
step();
}
private void step() {
ship.move();
repaint(ship.getX()-1,ship.getY()-1,ship.getWidth()+2,ship.getHeight()+2);
}
private class TAdapter extends KeyAdapter{
@Override
public void keyReleased(KeyEvent e) {
ship.keyReleased(e);
}
@Override
public void keyPressed(KeyEvent e) {
ship.keyPressed(e);
}
}
}
太空船舱:
公共级宇宙飞船{
private int dx;
private int dy;
private int x = 40;
private int y = 60;
private int w;
private int h;
private Image image;
public Spaceship() {
loadImage();
}
private void loadImage() {
ImageIcon ii = createImageIcon("../Images/spaceship.jpg","something");
image = ii.getImage();
w = ii.getIconWidth();
h = ii.getIconHeight();
}
private ImageIcon createImageIcon(String path, String description) {
java.net.URL imgURL = getClass().getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
public void move() {
x += dx;
y += dy;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getWidth() {
return w;
}
public int getHeight() {
return h;
}
public Image getImage() {
return image;
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = -2;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 2;
}
if (key == KeyEvent.VK_UP) {
dy = -2;
}
if (key == KeyEvent.VK_DOWN) {
dy = 2;
}
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) {
dx = 0;
}
if (key == KeyEvent.VK_RIGHT) {
dx = 0;
}
if (key == KeyEvent.VK_UP) {
dy = 0;
}
if (key == KeyEvent.VK_DOWN) {
dy = 0;
}
}
public static void main(String [] args) {
}
}
希望有人能看到我做错了什么
Rasmus您的代码正在每一帧向您的板(JPanel)绘制船舶图像,但没有清除之前在该帧绘制的图像,JPanel不会为您这样做。保留一份调用drawImage时使用的坐标副本,然后下次清除该区域,对于您的普通背景,您可以使用fillRect 例如,当您在纯黑色背景上绘制时,您可以在Spaceship类中添加如下内容并调用它,而不是在doDrawing中调用drawImage
private java.awt.Rectangle dirtyArea;
public void draw(java.awt.Graphics2D g2d, java.awt.image.ImageObserver observer) {
if (dirtyArea != null) {
g2d.setColor(java.awt.Color.BLACK);
g2d.fillRect(dirtyArea.x, dirtyArea.y, dirtyArea.width, dirtyArea.height);
}
int shipX = getX();
int shipY = getY();
Image shipImage = getImage();
g2d.drawImage(shipImage, shipX, shipY, observer);
if (dirtyArea == null || dirtyArea.width == -1) { // -1 check is there just in case the image wasn't loaded when this code ran before
dirtyArea = new java.awt.Rectangle();
dirtyArea.setSize(shipImage.getWidth(null), shipImage.getHeight(null)); // don't need observer as we're checking for -1 next time round
}
dirtyArea.setLocation(shipX, shipY);
}
请对代码和代码片段、结构化文档(如HTML/XML或输入/输出)使用代码格式。为此,请选择文本并单击邮件发布/编辑表单顶部的
{}
按钮。你可以随时回答你的问题。只需补充一点,一旦你一次在屏幕上有多个精灵,你会希望在绘制第一个精灵之前清除所有脏的区域(这样填充不会模糊任何精灵),当你只绘制一艘飞船时,上述方法只是最简单的示例,如果您继续使用这种方法,您可能会向Spaceship添加一个新方法,只清除脏区(位于!=null块内的部分),doDrawing然后会为所有精灵调用clear dirty area方法,然后为所有精灵调用draw方法。“只需添加,…”最好表示为答案的一个。