[英]Java 2D Game: The game loop
我用Java開發了一個簡單的2D游戲。 屏幕上的字符通過“按鍵綁定”控制。 游戲使用擴展JPanel的類來顯示圖形並包含大多數游戲邏輯。 此類的名稱為Board
。
每40毫秒我應該使用哪種類型的游戲循環進行游戲並repaint() Board
?
選項A:
Board
包含一個在程序啟動時啟動的線程。 該線程包含一個循環,該循環每40毫秒更新一次游戲並重新繪制paint()板。
選項B:
董事會創建一個Swing計時器。 此計時器的動作偵聽器是董事會本身。 actionPerformed()方法每40毫秒運行一次,並更新游戲+重新繪制Board()。
換句話說,在帶有鍵綁定的2D游戲中,什么對游戲循環更好,為什么?-擺動計時器或其中帶有循環的線程?
謝謝
如果處理速度很快,並且您SwingTimer
的更改涉及到與Swing的交互,而不僅僅是repaint()
那么SwingTimer
將是合適的,因為您已經在正確的線程上了。
原因:SwingTimer速度很快,您不需要線程開關即可更新Swing- 但是在處理過程中UI被凍結,因此如果您需要任何時間,玩家會注意到。
如果處理可能需要一些時間,並且您需要Swing交互,請使用SwingWorker
。
原因:設置了Swing worker來為您處理在Swing和worker線程之間來回傳遞的消息。
否則,請使用ScheduledExecutorService
和scheduleAtFixedRate
(這意味着您每40毫秒就會被調用一次,即使您的處理需要0、5、10或20毫秒)。 從EDT調用repaint()
方法是安全的。
原因: ScheduledExecutorService
是用於計划要在Java中執行的任務的標准方法。 它可以處理一次並重復執行,即使您的執行時間有所不同(只要您不超過40毫秒),它也可以使更新保持一致的速度。 您可以從任何線程調用repaint()
,因此無需擔心額外的線程同步。
附帶說明一下,此體系結構適用於簡單的游戲,但您應考慮在更復雜的游戲中更新可能需要40毫秒以上的時間,並考慮補償方法。
使用兩個線程,一個用於重畫,一個或多個用於對象的運動。 不確定為什么需要在它們之間進行同步,它們可以獨立工作。
如果屏幕上唯一移動的東西是由按鍵控制的字符(使用keyBindings),那么我相信您只有在移動字符后才能成功重繪屏幕,因此移動方法最后可以調用repaint。 我自己嘗試了一些簡單的項目,效果很好。 移動后,只有每個移動的對象都會調用重繪。
在其中一個項目(真的很簡單)中,我在actionPerformed中為keyBinding調用了repaint,如下所示:
class Right extends AbstractAction{
@Override
public void actionPerformed(ActionEvent e){
if (board.character.x < 465){ //check if not trying to move off the screen.
board.character.x += 7;
board.repaint();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.