2014-06-22 99 views
0

所以我在製作一款遊戲,我是一個相當凌亂的工人,然後我回去整理它。所以請忽略任何愚蠢的命名約定或方法或任何東西。當我回來後收拾整理。畫到畫布

所以基本上我試圖做一個主菜單,我只是想畫一些東西到屏幕上,並讓它留在那裏。我正在將圖形寫入圖像ATM並顯示圖像,因爲我試圖畫到畫布上,它只是閃到屏幕上,然後變成空白。我改變它爲可運行的,所以我可以放入睡眠()嘗試和錯誤狩獵。我現在刪除了所有的錯誤搜索代碼。事實證明,當我在屏幕上放置圖像超過50ms之前或之後有睡眠()時,該矩形停留在屏幕上,並且在繪製後不會像閃爍1ms那樣閃爍。

我不知道發生了什麼事。我可能不太清楚,我很抱歉。

import java.awt.Canvas; 
import java.awt.Graphics; 

import javax.swing.JFrame; 


public class test extends Thread{ 

    public static void main(String[] args){ 

     test t = new test(); 
     t.start(); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame("Test"); 
     Canvas c = new Canvas(); 
     Graphics g; 

     c.setSize(400, 400); 
     f.add(c); 
     f.pack(); 

     f.setVisible(true); 
     c.setVisible(true); 

     try { 
      sleep(2000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     g = c.getGraphics(); 

     g.drawRect(10, 10, 40, 68); 

    } 
} 
+0

歡迎來到Stack Overflow!考慮提供一個[可運行示例](https:// stackoverflow。com/help/mcve),這將演示你的問題,這將減少猜測工作併產生更好的響應 – MadProgrammer

+0

另外,你有什麼理由使用Swing使用基於AWT的組件嗎? – MadProgrammer

+0

就像我說的原諒我的不高興,我生疏,並沒有特別熟練的第一位。我現在寫一個可運行的代碼... – user3765631

回答

0

基本上,這不是AWT中的繪畫工作原理。繪畫應該在組件的paint方法的範圍內完成。在AWT Canvas似乎是使用的首選基本組件。

你永遠不應該使用getGraphics,除了能夠返回null,它只會表示從上次油漆週期Graphics背景下,任何加到它可以通過新的油漆事件被消滅約...這可能是發生給你。

查看Painting in AWT and Swing瞭解繪畫的工作原理。儘管如此,我會勸阻你使用基於AWT的API,因爲它在15年前被Swing所取代。

看看Performing Custom Painting關於繪畫更多細節Swing中

0

你那種得到的想法,但也有創造一個遊戲,對於初學者check out this code的幾個標準設計模式。

基本上,你需要一種叫做遊戲循環的東西,它會每秒鐘更新並呈現給顯示器一定的時間(幀率或幀率)。當它渲染時,它會以一定的時間間隔在新位置清除並重新繪製圖像,如果您的fps爲60,您將每秒渲染60次(清除並重新繪製)。我們還可以引入更高級的概念,如緩衝策略(如上例所示)以減少撕裂和閃爍。

概括起來講,你樣的都有,你只需要不斷地做g = c.getGraphics()所以......我

while (true) { 
    g = c.getGraphics(); 

    // set color 
    // draw a rectangle 

    g.dispose(); 
} 

注意如何加處置,這將只是釋放所有未使用的內存。只是爲了澄清,這絕不是好代碼,但它會給你一個開始的地方:)

閃爍是由於只有1屏幕,以停止這種閃爍,你需要一個buffer strategy。基本上有兩個緩衝區就像有兩個屏幕,當你在一個「屏幕」上渲染時,你可以清除並在第二個屏幕上繪製下一個步驟,並在兩個緩衝區之間切換;這減少了閃爍。