2013-06-28 57 views
1

我使用BufferedImage來獲得流暢的圖形(即沒有閃爍)。然而,中間畫的正方形非常閃爍,有時實際上看不見。我不知道什麼是錯,這種方法對我的其他遊戲運行良好。即使使用BufferedImage也是真正的閃爍圖形

這裏是我的代碼(廣場是由我定義的類型):

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 
import java.applet.*; 
import java.awt.event.KeyListener; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 

public class DodgeArrows extends Applet implements KeyListener,Runnable{ 
    BufferedImage backbuffer; 
    Thread gameloop; 
    Square player; 
    Random r = new Random(); 
    Graphics2D g2d; 
    AffineTransform trans = new AffineTransform(); 
    public void init() 
    { 
     backbuffer = new BufferedImage(640,480,BufferedImage.TYPE_INT_RGB); 
     g2d = backbuffer.createGraphics(); 
     player = new Square(); 
     player.setX(320); 
     player.setY(480); 
    } 
    public void start() 
    { 
     gameloop = new Thread(this); 
     gameloop.start(); 
    } 
    public void run() 
    { 
     Thread t = Thread.currentThread(); 
     while(t==gameloop) 
     { 
      try 
      { 
       Thread.sleep(20); 
      } 
      catch(InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
      repaint(); 
     } 
    } 
    public void stop() 
    { 
     gameloop = null; 
    } 
    public void update(Graphics g) 
    { 
     g2d = (Graphics2D)g; 
     g2d.setColor(Color.BLACK); 
     g2d.fillRect(0,0,getSize().width,getSize().height); 
     g2d.setColor(player.getColor()); 
     g2d.fill(player.getShape()); 
     paint(g); 
    } 
    public void keyTyped(KeyEvent e){} 
    public void keyPressed(KeyEvent e) 
    { 
     //irrelevant keylistener code 
    } 
    public void keyReleased(KeyEvent e){} 

    public void paint(Graphics g) 
    { 
     g.drawImage(backbuffer,0,0,this); 
    } 

} 
+1

1)爲什麼要編寫一個小程序?如果由於規格而到期。由老師,請參考[爲什麼CS老師應該停止教Java applets](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should-stop-teaching-java-applets/)。 2)爲什麼選擇AWT而不是Swing?在[Swing extras over AWT]上看到這個答案(http://stackoverflow.com/a/6255978/418556)有很多很好的理由放棄使用AWT組件。如果您需要支持較老的基於AWT的API,請參閱[混合重量級和輕量級組件](http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html)。 –

+0

@AndrewThompson我喜歡小程序。我是一個熱心者,而不是專業人士。 – imulsion

+0

好吧,你去..我想在那個世界上必須有*人*享受痛苦。 ;) –

回答

2

從您的更新(...)方法將其清除g2d = (Graphics2D)g;和你所有的問題就會迎刃而解。

您已經在行g2d = backbuffer.createGraphics();中創建了一個後緩衝器。當您將g指定爲​​時,您正在使它們都指向相同的圖形對象,並將您的緩衝區丟棄。你回來直接畫到屏幕上。

+0

謝謝!爲什麼這個工作? – imulsion

+0

對不起,我應該解釋一下!上面編輯。 – MaxAlexander

+0

感謝您的大力幫助;) – imulsion