[英]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問題的鏈接可能是一個很好的起點:
祝好運!
因此,您的繪制過程取決於鼠標的移動? 因此,您需要某種方式來告訴小程序自己更新?
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.