簡體   English   中英

如何在JFrame窗口中移動精靈(圖像)?

[英]How to move a sprite (image) across a JFrame window?

我在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像素!?

我在你的代碼中看到了幾個問題,包括:

  • 通過在組件上調用getGraphics()來獲取Graphics對象。 請注意,此對象不會保留。
  • 直接在JFrame中繪圖
  • 不繪制JComponent的paintComponent(...)方法,例如JPanel
  • 不在paintComponent(...)方法中調用super.paintComponent(...) paintComponent(...)方法。
  • 使用KeyListener而不是鍵綁定
  • 不使用Swing Timer進行動畫循環。

看起來你還沒有瀏覽過Swing圖形的教程,如果是這樣的話,我建議你這樣做沒有延遲,你也可以看一下如何在這個網站上找到動畫的很多例子,一些其中一些是由我創造的。

為了簡潔地解決你的問題,正在發生的事情是你本身並沒有重新繪制任何東西。 您只是將新圖像繪制在舊圖像之上,並且圖形保持重繪周期。

做一些像:

g.setColor(Color.white); g.fillRect(0,0,的getWidth(),的getHeight());

在繪制圖像之前。 將顏色更改為JFrame的背景顏色,使其看起來無縫(我認為它只是getBackgroundColor())。 不過,你應該得到一本關於Swing的好書。

暫無
暫無

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

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