遊戲的基本結構
遊戲是什麼呢?在遊戲中,往往是顯示各種各樣的畫面,玩家可以做一些設定好的控制,畫面根據玩家的控制有所變化。從這兒可以看出,遊戲至少需要三個功能-顯示畫面,接受玩家輸入和對輸入產生反饋。這就是常說的渲染,輸入輸出和邏輯三個模組。將這三個模組組合在一起有很多方法。比如事件驅動-畫面保持不變直到接受到輸入事件,程式進行邏輯運算然後改變畫面。而遊戲往往不是這樣,遊戲是時間驅動的。也就是說無論有沒有輸入,遊戲都在不停的迴圈-檢查是否有輸入,執行邏輯,渲染畫面。這裡我多說一句,其實什麼樣的結構並不能區別乙個程式是不是遊戲,其實只要可以互動娛樂的程式就可以稱為遊戲,也不一定要用時間驅動,但採用時間驅動是專業遊戲的普遍做法,也是很容易接受的方法-因為從一定程度上講,遊戲很像電影,隨著時間流逝畫面在改變。
0 初始化遊戲
1 是否結束遊戲(yes:轉到6)
2 蒐集玩家輸入資訊
3 執行遊戲邏輯
4 更新下一幀,顯示下一幀
5 回到1
6清理,結束遊戲
這是乙個最基本的結構,特別對於比較簡單的j2me遊戲來說,這個結構更加有代表性。下面我們將分別講述專業手機遊戲如何實現這個結構中的各個內容。
遊戲迴圈的實現
我們需要乙個進入後就一直迴圈下去直到遊戲結束的結構。執行緒正好可以實現。最通常的做法是讓canvas實現runnable介面。於是我們就可以實現run方法。下面是乙個run方法簡化版:
public void run()
catch (interruptedexception ex) {}
}endmidlet() ;
}
鍵盤緩衝
蒐集玩家輸入資訊是乙個很重要的內容,我們知道j2me中可以在keypressed和keyreleased事件中處理按鍵內容,但這樣勢必將邏輯**分散與gameloop和keypressed中。如果你說將所有邏輯**放在keypressed中,那可不行,因為keypressed只有在按鍵的時候才產生,而即使沒有按鍵遊戲也有很多邏輯運算要做。所以專業遊戲開發中採用鍵盤緩衝將按鍵資訊存起來,然後在gameloop中就可以判斷這一幀按鍵的狀態,利用按鍵緩衝,除了可以判斷乙個鍵是否按下鬆開,還可以判斷乙個鍵是否一直被按住了,甚至可以判斷組合鍵。不過在這裡,我只介紹一種最簡單的按鍵緩衝。由於篇幅所限,只講述原理並不給出具體**。
首先我們需要乙個資料結構儲存按鍵資訊。你可以為每個鍵用乙個bool值儲存它的狀態,不過專業一點的做法是用乙個位表示乙個鍵的狀態,乙個int有32個位,足夠表示大多數手機的所有按鍵了。因為我們要判斷鍵是否按下或鬆開,為了方便,我們再用2個整數記錄這兩種狀態。所以現在我們一共有三個int了:
static int key , pressedkey, releasedkey ;
ok! 有了儲存的地方,我們還需要一些常量表示每個位,我們設定key中某個位為0表示某鍵沒有按下,為1表示按下。如果用第1位表示0鍵,第2位表示1鍵,那麼可以這樣設定常量:
final static int gkey_0=1<<0, gkey_1=1<<1 ;
明白了嗎?這些常量是用來指定某個位用的,比如gkey_1其實就是第2為1其它位均為0的乙個整數。如果還不明白,先看下面的。
keypressed和keyreleased裡將分別將按下的鍵和鬆開的鍵進行記錄。
public void keypressed(int keycode)
public void keyreleased(int keycode)
在keypressed裡面,我們先將keycode轉換成我們的按鍵常量,就是上面的gkey_0等。因為keycode可不是像我們的常量那樣可以用某個位表示的,而且不同手機的keycode是有可能不一樣的,所以我們必須用乙個函式getkeyvalue進行轉化。得到常量後key|=value的作用是將key裡面常量所代表的位置1,現在你應該明白常量的作用了吧!pressedkey|=value同理。不過keyreleased有些不同,由於releasedkey只記錄這一幀裡哪些鍵「被鬆開」了,所以仍然用或運算。但key是記錄整個按鍵的狀態,所以用異或。
接下來就是如何判斷按鍵狀態了:
private static void acquirekey()
public static boolean keyhold(int gamekey)
public static boolean keydown(int gamekey)
public static boolean keyup(int gamekey)
還記得acquirekey吧,我們在while迴圈中首先要呼叫它,其作用就是記錄下這一幀的按鍵狀態,所有我們用了三個新int變數記錄他們,分別是framekey,framepressedkey和framereleasedkey。acquirekey所做的就是將按鍵狀態記錄在這3個變數中,其實framepressedkey和framereleasedkey不是必須的,只是這樣看上去比較清楚。記錄完後我們將pressedkey和releasedkey清空,以便下次有鍵按下或鬆開時記錄新的資訊。關鍵的三個函式登場了,keydown判斷某個鍵是否在這一幀裡被按下,引數gamekey是我們定義的按鍵常量中的某個值。如果對位運算還算明白的話,很容易看懂這3個函式。唯一要說明的就是keyhold和keydown的區別,keyhold表示某個鍵一直被按著,也就是至少從前一幀開始它就被按下了,而不是在這一幀裡被按下的。現在你應該明白我們為什麼要清空pressedkey和releasedkey了。
說到這裡也差不多了,有了這個按鍵緩衝我們就可以在gameloop中呼叫keydown等方法判斷按鍵的狀態了。不過我還是要說一句,這只是最簡單的按鍵緩衝,只能緩衝一次按鍵,如果乙個鍵被多次按下就不行啦。更專業的內容需要你在實際工作中探索。
專業手機遊戲開發基礎(1)
遊戲的基本結構 遊戲是什麼呢?在遊戲中,往往是顯示各種各樣的畫面,玩家可以做一些設定好的控制,畫面根據玩家的控制有所變化。從這兒可以看出,遊戲至少需要三個功能 顯示畫面,接受玩家輸入和對輸入產生反饋。這就是常說的渲染,輸入輸出和邏輯三個模組。將這三個模組組合在一起有很多方法。比如事件驅動 畫面保持不...
J2ME專業手機遊戲開發基礎(1)
遊戲的基本結構遊戲是什麼呢?在遊戲中,往往是顯示各種各樣的畫面,玩家可以做一些設定好的控制,畫面根據玩家的控制有所變化。從這兒可以看出,遊戲至少需要三個功能 顯示畫面,接受玩家輸入和對輸入產生反饋。這就是常說的渲染,輸入輸出和邏輯三個模組。將這三個模組組合在一起有很多方法。比如事件驅動 畫面保持不變...
遊戲開發基礎
任何遊戲都需要一些基本框架,用於實現抽象化,並減輕與底層作業系統互動的痛苦。通常這一框架分成幾個模組 用於建立乙個視窗和處理一些操作,如關閉視窗 暫停或恢復android應用程式等。與視窗管理模組相關聯,用於跟蹤使用者的輸入,如觸控事件 按鍵事件 加速計讀取等。android系統中,這些輸入會被排程...