簡體   English   中英

Java 2D游戲:游戲循環

[英]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線程之間來回傳遞的消息。

否則,請使用ScheduledExecutorServicescheduleAtFixedRate (這意味着您每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.

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