簡體   English   中英

帶有繪畫方法的Java Applet麻煩

[英]Java Applet Troubles w/ Paint Method

到目前為止,我已經使這個applet進入了工作階段。 唯一的問題是它僅在鼠標移動時才起作用。 如果不移動鼠標,則整個過程都會停止。 如果移動鼠標,它將重新開始工作。

它的工作方式是paint方法,由mouseMoved方法調用。 每次移動鼠標時,鼠標都會拋出繪畫方法,然后游戲繼續。 問題是由於未調用mouseMoved方法而導致的,因此未調用paint方法,並且整個過程只是暫停,直到移動鼠標為止。

我嘗試了以下方法:

具有paint方法是遞歸的,因此它將自行調用。 問題在於鼠標偵聽器不起作用,因為該程序正忙於繪制一堆移動的東西。

我還嘗試使用線程,以便mouselistener會中斷paint方法。 盡管這可能是因為我不了解線程是如何工作的,但這沒有用。 如果有人知道如何實現這一點,那似乎就可以了。

這是問題區域的代碼片段;

  public void paint( Graphics gr) {
     if( Earth != null){

        displayWorld(Earth);
        for(int a =0; a < 100; a++){      
           Earth.run();
           Earth.Worlds.get(2).forceMove(x,y);
          }
        try
        {
           Thread.sleep(100);  
        }
           catch (InterruptedException ie)
           {}   
     }

  }

public void mouseMoved( MouseEvent e ) {
     x = e.getX();
     y = e.getY();
     Graphics gr = getGraphics();      
    paint(gr);
  }  

我建議再看看線程。 這是游戲編程(以及其他編程領域)中的一個非常標准的問題-您擁有一個永久循環的線程,其中包含您的游戲邏輯。 它會更新您球員的位置,進行計算,保持健康,或者在沒有工作要做的情況下進入睡眠狀態。 如果完成了需要重繪applet圖形的工作,則您的線程調用repaint() ,它將重繪請求發送到事件分配線程(在每個Java程序中都會自動創建的特殊線程)。

當播放器移動鼠標或提供鍵盤輸入時,事件偵聽器將更新程序的數據結構(並在睡眠狀態下戳入主線程)。

這些指向以前涉及Java游戲的StackOverflow問題的鏈接可能是一個很好的起點:

在不凍結UI線程的情況下實現游戲循環的最佳方法

游戲循環-線程

祝好運!

因此,您的繪制過程取決於鼠標的移動? 因此,您需要某種方式來告訴小程序自己更新?

private javax.swing.Timer paintTimer;

public void start() {
    // Your normal setup...

    paintTimer = new javax.swing.Timer(250, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            Graphics gr = getGraphics();      
            paint(gr);
        }
    });
    paintTimer.setRepeats(true);
    paintTimer.setCoalesce(true);
    paintTimer.start();
}

public void mouseMoved( MouseEvent e ) {
    x = e.getX();
    y = e.getY();

    // You could wait for the timer to trigger the repaint for you...
    repaintTimer.restart();

    Graphics gr = getGraphics();      
    paint(gr);
}  

不過,您將需要把握時機

暫無
暫無

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

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