2012-01-13 55 views
2

我正在編寫一個太空入侵者克隆,我需要入侵者做他們平常的動作,但在再次移動之前暫停一秒。只有一部分的類等待執行,有或沒有線程?

EG。移動5個像素,然後等待,然後再移動5個像素。

該方法調用moveInvaders()是我想等待1000ms的方法。下面是這樣的方法。

private void moveInvaders() { 
     if(direction == "right") { 
     if(invaderGreenEight.getX() == 455 || invaderRedEight.getX() == 455 || invaderBlueEight.getX() == 455) { 
      direction = "left"; // Change direction to left 
     } 
    } else { 
     if(invaderGreenOne.getX() == 15 || invaderRedOne.getX() == 15 || invaderBlueOne.getX() == 15) { 
      direction = "right"; // Change direction to right 
     } 
    } 

    if(direction == "right") { 
     // Move Green Invaders Right 
     invaderGreenOne.moveX(1); 
     invaderGreenTwo.moveX(1); 
     invaderGreenThree.moveX(1); 
     invaderGreenFour.moveX(1); 
     invaderGreenFive.moveX(1); 
     invaderGreenSix.moveX(1); 
     invaderGreenSeven.moveX(1); 
     invaderGreenEight.moveX(1); 
     // Move Red Invaders Right 
     invaderRedOne.moveX(1); 
     invaderRedTwo.moveX(1); 
     invaderRedThree.moveX(1); 
     invaderRedFour.moveX(1); 
     invaderRedFive.moveX(1); 
     invaderRedSix.moveX(1); 
     invaderRedSeven.moveX(1); 
     invaderRedEight.moveX(1); 
     // Move Blue Invaders Right 
     invaderBlueOne.moveX(1); 
     invaderBlueTwo.moveX(1); 
     invaderBlueThree.moveX(1); 
     invaderBlueFour.moveX(1); 
     invaderBlueFive.moveX(1); 
     invaderBlueSix.moveX(1); 
     invaderBlueSeven.moveX(1); 
     invaderBlueEight.moveX(1); 
    } 
    if(direction == "left") { 
     // Move Green Invaders Left 
     invaderGreenOne.moveX(-1); 
     invaderGreenTwo.moveX(-1); 
     invaderGreenThree.moveX(-1); 
     invaderGreenFour.moveX(-1); 
     invaderGreenFive.moveX(-1); 
     invaderGreenSix.moveX(-1); 
     invaderGreenSeven.moveX(-1); 
     invaderGreenEight.moveX(-1); 
     // Move Red Invaders Right 
     invaderRedOne.moveX(-1); 
     invaderRedTwo.moveX(-1); 
     invaderRedThree.moveX(-1); 
     invaderRedFour.moveX(-1); 
     invaderRedFive.moveX(-1); 
     invaderRedSix.moveX(-1); 
     invaderRedSeven.moveX(-1); 
     invaderRedEight.moveX(-1); 
     // Move Blue Invaders Right 
     invaderBlueOne.moveX(-1); 
     invaderBlueTwo.moveX(-1); 
     invaderBlueThree.moveX(-1); 
     invaderBlueFour.moveX(-1); 
     invaderBlueFive.moveX(-1); 
     invaderBlueSix.moveX(-1); 
     invaderBlueSeven.moveX(-1); 
     invaderBlueEight.moveX(-1); 
    } 
} 

遊戲已經是一個線程和所討論的方法是在同一類,所以發出的Thread.sleep(1000);只是暫停整個遊戲1秒,但我只想執行一種方法暫停。

如果您想了解更多信息,我很樂意提供。

蓋斯特

+0

不,您可能不需要直接創建單獨的獨立線程。請提供更多信息和一些代碼。 – 2012-01-13 14:09:24

+0

見編輯回答。 – 2012-01-13 14:26:05

回答

2

moveInvaders()方法應該跟蹤其存儲入侵者上次移動的時間的成員變量的(例如,作爲long毫秒數),這樣一來,它被稱爲它可以檢查該變量的值的任何時間 - 如果足夠的時間過去了,那麼入侵者可以移動,如果沒有,那麼該方法將簡單地返回而不做任何事情。例如:

protected long invadersLastMovedMillis; 

protected void moveInvaders() { 
    long currentTime = System.currentTimeMillis(); 
    if ((invadersLastMovedMillis != 0) 
     && ((currentTime - invadersLastMovedMillis) < 1000L)) { 
    return; // No need to move them yet. 
    } 
    // March on, space invaders! 
    invadersLastMovedMillis = currentTime; 
} 

您不希望實際上導致線程進入睡眠狀態,因爲遊戲會變得無法響應!

+0

因此,每次調用moveInvaders()方法時,它會如何檢查自上次移動以來的時間?我會在每次執行時使用'for'循環來增加嗎?但是由於處理器速度越來越快,這會帶來性能問題。嗯。 – 2012-01-13 14:12:58

+0

@GeissT:每次移動入侵者時都會以毫秒爲單位更新當前時間的變量;那麼您可以在每次考慮移動它們以查看是否已經過了足夠的時間之前檢查該變量。查看更新的答案。 – maerics 2012-01-13 14:14:01

+0

啊我看到了,你的編輯很好地解釋了它。我會做一個測試並報告回去...... – 2012-01-13 14:23:00

1

我猜你會使用某種類型的計時器,但將取決於還不知道我們的許多問題什麼樣的。你使用的是什麼GUI庫?例如,如果這是一個Swing GUI,我建議使用Swing Timer來處理這個延遲 - 但是我們不知道你使用了什麼庫。

底線:請提供更多信息和代碼。

編輯: 第一個建議:擺脫所有if(myString ==「Foo」)。你不應該這樣比較字符串,因爲這會檢查一個字符串對象是否是一個字符串對象,並且你不關心這個。你想知道他們是否有相同的內容。請使用String#equals(...)或String#equalsIgnoreCase(...)方法。

接下來:使用數組來減少嚴重的代碼冗餘存在。

最後對於Swing應用程序,考慮使用擺動計時器來驅動您的遊戲循環,並在計時器中通知收聽時間滴答的項目。然後讓這些項目在自上次操作後經過一定時間後纔會響應。

+0

我正在使用Swing,氣墊船。 – 2012-01-13 14:13:27

+0

@GeissT:如果我們有半數的禱告能夠回答這個問題或其他類似的問題,你真的想告訴我們細節。總是寫下你的問題,假設我們無法讀懂你的想法或神奇地看到你的代碼。我想你會想編輯你的原始問題並提供更多的細節。 – 2012-01-13 14:15:00

+0

我會爲你提供我的moveInvaders()方法。 – 2012-01-13 14:17:22

0

在創建遊戲線程的同一級別創建另一個線程(比如T1)。

在遊戲線程完全創建後啓動它,或者在沒有任何崩潰的情況下調用moveInvaders()方法。

ASA遊戲線程結束,也停止T1。

遊戲已經是一個線程和所討論的方法是在同一類,所以發出的Thread.sleep(1000);只暫停1秒整個遊戲,但我只想一個的方法來執行暫停。

問題是有一個類,一個對象,只有一個線程執行。它應該是一個類,一個對象和兩個線程。 (遊戲線程和T1)

+0

謝謝你的回答,我選擇了另一位用戶的回答,但我一定會考慮到這一點! :) – 2012-01-13 14:28:15