2011-08-08 43 views
1

我打算爲Android創建一個簡單的基於回合的2D遊戲,據我所知基本上有三種方法來執行繪圖。回合制遊戲,哪種繪圖方法?

  • 使用「正常」視圖,並且只在需要時繪製(例如觸摸事件)。
  • 在單獨的線程中使用SurfaceView與「遊戲循環」相結合,繪製每個循環迭代。
  • OpenGL(我不知道它是如何工作的)。

當我做了一個小的模擬遊戲(一拉法姆維爾)我用了SurfaceView,因爲它使用了一些簡單的動畫,如果我用了一個「正常」的看法,我不得不用一個定時器來更新圖形在一定的時間間隔我不知道這兩種方法哪一種更好,但SurfaceView方法似乎更容易。另一方面,我認爲使用無限的「遊戲循環」會很快耗盡電池。至於OpenGL,我不知道它是如何工作的,或者它對於簡單的遊戲太複雜了。

所以,如果我有一個簡單的回合制遊戲(有點像神奇寶貝的戰鬥部分),上述哪種方法最好?其他遊戲使用什麼(如憤怒的小鳥,DanteInferno,Inotia,Jewels,Robo Defense,Wisp,Zonina等)?

我發現網上的信息很不清楚要在什麼時候使用。

+0

這個問題有一個專門的社區:gamedev.stackexchange.com – Den

+0

@Den,對不起,我沒有線索......我一直在堆棧溢出已經有一段時間了,所以我沒有意識到那裏是這類問題的獨立社區。 – pbean

回答

2

我有一個簡單的棋盤遊戲,這是一種基於轉向的遊戲,我用SurfaceView,它出來相當不錯。您可以優化SurfaceView,但如果您使用標準視圖,特別是如果您有滾動遊戲,則最終會遇到問題。

我已經使用這篇文章,它非常有幫助,它有一堆不同的方法來實現遊戲循環的優點和缺點:http://www.koonsolo.com/news/dewitters-gameloop/ 這是一個很好的起點。

關於電池耗盡 - 您可以使用Thread.sleep(),以便它可以持續更長時間。沒有對電池進行任何測試,但你必須面對遊戲耗盡電池的事實,特別是如果你玩它幾個小時:)

+0

啊,謝謝,我會看看那個鏈接,看看我能收集什麼。對於滾動遊戲,你的意思是什麼?這對選擇有何影響?我知道無論如何遊戲會消耗電池,但我認爲一個小型遊戲(想像寶石迷陣式)不應該像一個非常複雜的大型遊戲一樣消耗電池電量(認爲已經移植到手機上的憤怒的小鳥,甚至是Doom/Quake) )。 – pbean

+0

滾動遊戲:如果您的遊戲級別比屏幕大小更寬/更高,則必須滾動。在你滑動左/右縮放/縮放時憤怒的小鳥。因爲你可以對它進行優化,所以最好使用SurfaceView。 – blejzz

1

OpenGL也使用一個繪製循環,這是反覆調用,所以它會以與SurfaceView方法類似的方式操作。 OpenGL因其性能而受到稱讚,但其確實帶來了相當多的複雜性 - 對於一個小型項目來說,它可能不值得投資,除非您想要了解它的工作原理!

至於電池壽命,CPU消耗最多的任務將是最耗盡的,這意味着最有效的重繪策略(基於時間或事件驅動)將是最佳選擇。對一個簡單的原型進行基準測試可以讓您瞭解哪種遊戲代碼最適合您。

1

我還沒有在Android上進行遊戲開發,但我一直在創建一個涉及很多動畫和滾動UI元素的應用程序。對於這個項目我使用了普通的擴展視圖和SurfaceViews的混合體,而且我不得不借用傳統上用於遊戲編程的許多技術。沿途我已經學會了正常的Views和SurfaceView的不同之處,以及使用它們的優點和缺點。

兩者之間的重大差異,我認爲很重要,這是因爲使用SurfaceView幾乎可以直接寫入屏幕緩衝區(技術上不正確 - 但考慮最簡單的方法)只要你願意,並且經常按你的意願(在限制範圍內)。它不會在普通的View層次結構中「坐」。能夠以這種方式繪製允許快速動畫圖形(特別是通過偏移位圖來創建滾動背景並在頂部覆蓋動畫位圖精靈)。您的代碼直接在需要時執行繪圖。就我自己的經驗而言,SurfaceView的主要缺點是您不能在其後面顯示任何其他視圖(即無透明效果)。

另一方面,正常視圖位於普通視圖層次結構中。與SurfaceView不同的是,不能與一起執行正常View的重繪,只要您的代碼需要。您必須在該視圖上調用invalidate()(或從非UI線程中的postInvalidate())以告訴系統您要重繪它,然後系統在一段時間後最終會調用該視圖的onDraw()以執行繪製。無法保證將被調用的速度有多快,這可能會限制您更新圖形的速度。然而,普通視圖的優點在於它位於普通視圖的層次之內,並且您可以將視圖放置在彼此的頂部並具有透明度等等。