2014-01-25 78 views
2

我已經在網上看了一遍,無法找到以下的有效答案。 在Android中,當使用SurfaceView和Thread來簡化遊戲循環時,通常您的onDraw調用會永久運行。這對渲染事物來說很好,但是因爲你的遊戲邏輯也在這個循環中(檢查遊戲結束條件,鼠標事件等),如果你只有一次運行的代碼會怎麼樣?Android遊戲循環邏輯混亂

因爲我覺得這個不清楚,讓我舉個例子。

我正在與幾個州製作遊戲。當狀態設置爲標題時,遊戲循環執行titleScreenRendering()方法,該方法具有從0到1漸變的alpha的圖像;就像閃屏一樣。由於這個調用是在遊戲循環中,「titleScreenRendering」被調用9999999次,圖像衰落邏輯也是這樣,這顯然不起作用。

我發現其中一種感覺就像是黑客行爲的方法是隻做一個布爾值並在遊戲循環首次運行該方法時將其設置爲false,以便在999999後續調用中至少有部分代碼不再運行。

我在這裏做錯了什麼?我的設計是錯誤的,如果這是爲什麼99%的Android遊戲教程似乎主張這種方法?請讓有些聰明的人可以指引我走向正確的方向。我想自己做這個,但我很想用圖書館。

回答

0

您使用邏輯來完成您想要做的事情,而不是真正影響性能。我在這裏沒有看到問題。

如果這是關係到你的狀態機,只要確保切換回狀態(標題?)從別的復位布爾。

只需創建一個條件來決定函數是否運行。這些首批運行的方法存在並且很常見。通常,特別是在java中,您可以在構造函數中完成所有首次運行的內容。但這並不總是可選或最佳的。

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

嗨,感謝您的回覆。所以你建議只使用一個布爾值來將我的代碼部分的執行限制到一次,並讓循環無限制地渲染?我覺得遊戲循環不應該像這樣工作。你爲什麼要調用像「initTitleScreen」9999倍而不只是一次?我認爲這是我設計時的錯誤 – Fenix

+0

更新了我的答案 – Nocare

0

如果您願意,您可以將遊戲邏輯放在另一個線程上。計算圖形線程的邏輯對於小型遊戲來說是很好的,但是如果你的遊戲有很多不同的部分不需要每次都運行,你將會浪費一些(儘管通常無關緊要的)CPU能力來檢查每個條件你跑步的時間。除此之外,在遊戲的每一步都有一個長達五頁的onDraw方法並不是很好。如果你的遊戲有很多邏輯,這也可能會降低渲染速度,因爲在顯示任何東西之前,系統一直等待onDraw()返回。

考慮有一個只包含圖形信息的Scene類,比如需要在哪裏繪製。從onDraw方法中,根據Scene類中的信息構造SurfaceView。從遊戲邏輯線程,處理用戶輸入和精靈位置等...並構建/修改場景對象。最後還有一件事,如果您選擇這樣做,我還建議您在繪圖線程和邏輯線程之間進行同步,這樣您將不會獲得任何中途修改的Scene對象。

1

我已經在Android中以類似的方式實現了我的遊戲,您正在做什麼。我在模擬屏幕的引擎中添加了一個「圖層」。在遊戲核心循環中,我只繪製和更新屏幕。這樣,如果我有幾個菜單等屏幕,我只畫和更新其中之一。引擎具有對當前屏幕的引用。

也可以將屏幕分爲幾個狀態。狀態或狀態機然後知道在屏幕的該特定狀態下應該進行什麼樣的計算或繪畫。最終你需要某個地方某種邏輯(控制流),但我會嘗試將邏輯封裝到負責某些事情的類。這樣以後可以更容易理解和重構遊戲。