2015-06-04 91 views
0

當我使用這段代碼時,圖像(從我定義的spritesheet的部分)繪製,但它在前面的實例上重繪它。我需要「圖像」來「移動」。 Im使用paint方法,用Graphics重繪在init()方法中定義的sprite。我只是試圖創建一個「小人物」,一旦它被添加到程序中,開始從屏幕的左下方「行走」到右邊,本身(沒有用戶動作移動它)。目前,我可以得到它只是把圖像和「污跡」,它在屏幕的底部(它不斷地繪製它在本身)雪碧繪圖問題

(除去進口爲簡單起見)

public class Main extends JFrame { 

    BufferedImage sprite; 
    int War_x = 10, War_y = 640, War_dx = 1; 

    public Main() 
    { 
     //(X,Y) ---- (LEFT,UP) 
     //Window theGUI = new Window(); 
     //JFrame theGUI = new JFrame(); 
     setSize(870,720); 
     setTitle("Game"); 
     setBackground(Color.red); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setVisible(true); 

     init(); 

    } 
    public void init() 
    { 
     BufferedImageLoader loader = new BufferedImageLoader(); 
     BufferedImage spriteSheet = null; 
     System.out.println("bruh"); 
     try { 
      spriteSheet = loader.loadImage("warrior.png"); 
     } catch (IOException ex) { 
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     SpriteSheet ss = new SpriteSheet(spriteSheet); 

     sprite = ss.grabSprite(0,130,32,36); 


    } 
@Override 
public void paint(Graphics g){ 

    g.drawImage(sprite, War_x, War_y,64, 64, null); 
    warrior start = new warrior(); 
    start.start(); 
    repaint(); 
} 

public static void main(String[] args){ 
    Main main = new Main(); 
} 


public class warrior implements ActionListener{ 
    public Timer T = new Timer(100, this); 

    public void start(){ 
     T.start(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     War_x += War_dx; 
    } 

} 

}

回答

0

首先,不建議直接繪製到JFrame上。這是您「弄髒/等」問題的原因之一。使用畫布或類似的繪圖工具。對於像BufferedImage這樣的東西繪製也可能更好,並將其繪製到屏幕上,而不是直接繪製到屏幕上。第二,如果你想讓它不斷移動,我會把它放在外面的一個循環中,並且只需從一個單獨的線程自動更新畫布。

這裏是一個鏈接,讓你開始使用線程https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

+0

即時通訊仍然是這個新的,所以虐待你的建議使用畫布。但是,循環的問題是,我需要延遲或FPS速率,以便用戶實際看到精靈正在移動。我試着用這個定時器,但即時通訊並不是那麼棒。 – user2826539

+0

如果將繪圖放入線程中,可以使其非常簡單,並且只需沿着add.sleep()的一行就可以了。我不確定你想要如何複雜,但它可能是你最好的選擇。 – Sh4d0wsPlyr

+0

我如何設置線程?目前,我相信使用thread.sleep()會導致整個幀睡眠。我計劃在屏幕上移動多個獨立的小精靈,這種方法對於這種情況仍然是最好的嗎? – user2826539

0

爲了讓精靈「移動」,你需要從他那裏曾經是畫布除去了他,然後畫了他在他的新位置。

爲了真正做到這一點,你可能不得不做這樣的事情:一個實際

  1. 清除屏幕
  2. 重繪更新的背景
  3. 重繪更新實體

所以情況,假設你的背景只是一個普通的白色矩形,其中canvasWidthcanvasHeight是你的畫布的寬度和高度,你的畫圖m方法會看起來像這樣:

@Override 
public void paint(Graphics g){ 
    g.setColor(Color.WHITE); 
    g.fillRect(0, 0, canvasWidth, canvasHeight); 

    g.drawImage(sprite, War_x, War_y,64, 64, null); 
    repaint(); 
} 
+0

謝謝,這看起來很麻煩,但如果這是最好的方式,那麼好吧。我如何完全清除屏幕? – user2826539

+0

如果你使用'Graphics'對象,那麼'g.clearRect'可能是你最好的選擇。這隻會清除矩形中的所有內容,然後您可以重新繪製背景,角色,對象等。 – Clark

+0

好吧,我明白了,生病給它一個鏡頭謝謝 – user2826539