簡體   English   中英

Android游戲循環邏輯混亂

[英]Android Game Loop Logic Confusion

我在網上瀏覽了一下,找不到以下內容的有效答案。 在Android中,當使用SurfaceView和Thread促進游戲循環時,通常您的onDraw調用將永久運行。 這對於渲染事物是很好的,但是由於您的游戲邏輯也在此循環中(檢查游戲是否符合條件,鼠標事件等),如果您的代碼只需運行一次,該怎么辦?

既然我不清楚,讓我舉個例子。

我正在與多個州進行比賽。 當狀態設置為title時,游戲循環執行titleScreenRendering()方法,該方法具有從0到1的alpha漸隱的圖像。 諸如啟動畫面之類的東西。 由於此調用處於游戲循環中,因此“ titleScreenRendering”被調用了9999999次,因此圖像淡入邏輯也被調用,這顯然不起作用。

我發現感覺像是被黑客入侵的一種方法是,在游戲循環第一次運行該方法時,僅將其設置為布爾值並將其設置為false,以便在999999隨后的調用中至少不再運行該部分代碼。

我在這里做錯了什么? 我的設計是錯誤的嗎?如果是,為什么99%的Android游戲教程似乎都倡導這種方法? 請讓一個聰明的家伙可以指出正確的方向。 我想自己做,但是我很想只使用一個庫。

我已經在Android中實現了與您正在做的游戲類似的游戲。 我在引擎中添加了一個模擬屏幕的“圖層”。 在游戲核心循環中,我僅繪制和更新屏幕。 這樣,如果我有多個屏幕,例如菜單等,那么我只會繪制並更新其中一個屏幕。 引擎具有對當前屏幕的引用。

也可以將屏幕划分為狀態。 然后,狀態機或狀態機知道在該屏幕的特定狀態下應該執行哪種計算或繪制。

最終,您需要在某種地方使用某種邏輯(控制流),但是我會嘗試將邏輯封裝到負責某些事情的類中。 這樣,以后更容易理解和重構游戲。

您的使用邏輯以一種不會真正影響性能的方式准確地完成您想做的事情。 我在這里沒有問題。

如果這與您的狀態機有關,則只需確保從其他任何狀態切換回state(title?)即可重置布爾值。

只需創建一個條件即可確定該函數是否運行。 這類首次運行的方法已經存在並且很常見。 通常,尤其是在Java中,您可以在構造函數中完成所有首次運行的工作。 但這並不總是可選的或最佳的。

if( shouldInutRun != false ) {
    initTitleScreen();
}

如果選擇,您可以將游戲邏輯放在另一個線程上。 對於小型游戲,在圖形線程上計算邏輯是很好的選擇,但是如果您的游戲有很多不同的部分不需要每次都運行,那么您將浪費一些(盡管通常是無關緊要的)CPU能力來檢查每種情況你跑步的時間。 除此之外,擁有onDraw方法對於游戲的每一步都需要五頁時間,這看起來並不好。 如果您的游戲有很多邏輯,這也會降低渲染速度,因為系統會等到onDraw()返回后再在表面上顯示任何內容。

考慮擁有一個僅包含圖形信息的Scene類,例如需要在何處繪制的信息。 從onDraw方法,根據Scene類中的信息構造SurfaceView。 從游戲邏輯線程中,處理用戶輸入和精靈位置等,並構造/修改Scene對象。

最后一件事,我還建議,如果您選擇執行此操作,以使繪圖線程和邏輯線程之間保持同步,這樣一來,您將不會獲得任何經過一半修改的Scene對象。

暫無
暫無

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

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