iPhone 游戲開發(fā)教程 游戲引擎 (5)
iPhone 游戲開發(fā)教程 游戲引擎 (5)是本文要介紹的內(nèi)容,繼續(xù)上一章的你內(nèi)容開始介紹,本節(jié)主要介紹了聲音引擎和事件的內(nèi)容,關(guān)于事件的介紹,下篇文章將會詳細介紹。
聲音引擎
聲音是游戲開發(fā)中經(jīng)常忽略的一的環(huán)節(jié),但是當(dāng)你知道聲音構(gòu)成了人類玩視頻游戲的1/3的感覺時,你肯定會很困窘。在合適的時機播放正確的聲音使得程序員僅作很小的工作就可以為游戲增加分數(shù)。
基本的音效特征包括載入和卸載聲音樣本、播放聲音、停止播放、暫停播放以及循環(huán)播放。典型的,所有的聲音都可以以同樣的音量播放,但是你可能希望玩家調(diào)整以使所有的聲音都符合他們的喜好。
聲音樣本
在播放音效之前,你需要從文件或者緩存中載入聲音樣本。IPHONE API支持AAC與MP3格式的高品質(zhì)的聲音,也支持PCM和IMA4的小樣品,以及其他一些格式。
播放聲音
一旦載入了聲音樣本,API提供了函數(shù)以開始和停止播放樣本。大多數(shù)API還提供了暫停和繼續(xù)功能,還有一些允許你從特定點開始播放。雖然還有更多高級特性,但是基本上以上就是程序員全部所需要的了。
多聲道聲音
因為聲音播放依賴于硬件,你在同一時間可以聽到的聲音是有限的。每種聲音播放時都使用一個聲道。在IPHONE中,所有的MP3和AAC樣本共用相同的硬件聲道,而且只有一個是可用的,多聲道支持PCM和IMA4。
這意味著同一時間,只有一個MP3/AAC格式的樣本可以被播放。典型的,但多個PCM/IMA4樣本可以同時播放多個樣本(同時與MP3/AAC播放)。
音樂與SFX
游戲中的大部分聲音都可以分為兩大類:環(huán)境音(典型的,背景音樂)和音效(SFX)。有時,用環(huán)境音代替音樂,但他們都共享同樣的特點。
音樂一般是重復(fù)播放一個相對長的樣本或者引出下一段音樂樣本。通常情況下,只有一首音樂在同一時間播放,使得MP3/AAC格式限制變成了一個不成問題的問題。
聲效要短的多,而且需要許多不同的樣本,在同一時間重疊播放。PCM/IMA4格式很好的滿足了這個需求。
由于PCM/IMA4也只有有限的聲道數(shù),因此如果你打算同時播放很多的SFX樣本,其中一些可能不能被播放。所以,為SFX音效設(shè)定優(yōu)先級以確保某些音效一定能播放就顯得很重要了。
例如,讓我們討論之前提到的我們的玩家虛擬人偶走進了一個滿是憤怒的犀牛的房間。每頭犀牛都會播放憤怒的鼻息聲,可能還會接著播放撞人的聲音,而玩家虛擬人偶則會發(fā)出害怕的哭叫聲。我們會給與玩家虛擬人偶聲效更高的優(yōu)先級,以使其不會被犀牛的撞人聲效所淹沒。
幸運的是,目前的IPHONE支持至少32聲道,所以一般不太可能需要在這個平臺上去刻意安排優(yōu)先級。
輸出設(shè)備與干擾
IPHONE支持內(nèi)置的對講機與聽筒作為輸出設(shè)備。建議不要同時使用它們。當(dāng)玩家將聽筒插入到IPHONE中時,音頻會自動改為從聽筒播放。
由于IPHONE是移動設(shè)備,有可能玩家在路上在的時候,聽筒會掉落。一個好的設(shè)計選擇是當(dāng)聽筒被移除的時候暫停游戲以給玩家足夠的時間讓他重新接入耳機。此時,你也可以選擇同時提供停止播放聲音。
最重要的是,應(yīng)該從玩家的用戶角度來考慮聲效。玩你的游戲并不是用戶使用IPHONE的***標(biāo)準(zhǔn),所以不要讓你的聲效的優(yōu)先級打擾到用戶,否則玩家會將其關(guān)掉。
用戶輸入
游戲引擎的玩家輸入部分集中于來接收自于操作系統(tǒng)的低層次的事件,然后將其轉(zhuǎn)化為高層次的事件,這樣,游戲邏輯代碼可以在PC游戲中使用它。低層次的事件可以是鼠標(biāo)和鍵盤事件。對于控制臺游戲,他們可能產(chǎn)生于控制器的手、觸發(fā)器與按鈕。在我們的例子里面,IPHONE會處理觸摸與旋轉(zhuǎn)事件。
觸摸事件
觸摸屏接口的設(shè)計方式與其他大多數(shù)移動手機、控制臺與PC平臺的接口設(shè)計方式有著根本的區(qū)別。在用戶觸摸屏幕與應(yīng)用程序接收到該事件之間有延遲(盡管IPHONE已經(jīng)在將縮短延遲方面做的足夠好了),但是真正的問題是,不管何時用戶做出觸摸動作,他的手指都會遮蓋住部分屏幕,大大降低了游戲畫面的可見性。
你可以通過提供一個圖形按鈕給用戶來點擊(回到了按鈕點擊系統(tǒng),代價是屏幕空間),或者提供一個聰明的隱喻來解決這個問題。比如,如果玩家點擊了屏幕上的一塊空間,你可以讓虛擬人偶朝那個方向走。這樣可以省去用戶的連續(xù)點擊輸入。
盡管用戶接口設(shè)計是游戲設(shè)計人員的責(zé)任,但是編程人員需要告訴設(shè)計人員這個平臺可以做什么和不能做什么。IPHONE支持以下觸摸事件:
觸摸開始
觸摸移動
觸摸結(jié)束
觸摸取消
你可能會問什么情況下會觸發(fā)“觸摸取消”事件。當(dāng)某個事件將你的應(yīng)用程序掛起在“觸摸開始”事件與“觸摸結(jié)束”事件之間時,程序會收到“觸摸取消”事件通知你不會收到其他的事件(如觸摸結(jié)束)。
為了處理多點觸摸,包含一個UITouch對象list的UIEvent對象被發(fā)送到你的應(yīng)用程序中。如果只有一個指頭觸摸到屏幕,你只會接收到一個UITouch對象;如果兩個指頭觸摸到屏幕,你會接收到兩個UITouch對象等等。而且IPHONE可以追蹤正在發(fā)生或最近發(fā)生的連續(xù)的5次輕擊事件(一個觸摸開始事件后緊跟一個觸摸結(jié)束事件)。
不幸的是,通過以上事件來判斷用戶是單擊、雙擊、掃過或者壓縮動作會可能變得比較麻煩。雖然不是很困難,但是在一開始并不是很容易正確處理??匆韵吕樱?/p>
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Handle single-tap..
到目前為止,用戶觸摸了屏幕一次,你的代碼可以執(zhí)行相應(yīng)的單擊處理邏輯。但是稍等!
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Handled single-tap.. INCORRECTLY
- Time 200: TouchStart - numTaps (1) numTouches(1) Touches { (40,40) }
- Time 300: TouchEnd - numTaps (2) numTouches(1) Touches { (40,40) }
- FAILED to handle double-tap
用戶第二次輕擊了屏幕。如果你已經(jīng)在收到觸摸結(jié)束的事件時進行了處理,可能錯誤的處理了用戶實際上的雙擊處理。
我們應(yīng)該如何正確處理這種情況呢?解決方法是將***次觸摸結(jié)束事件推遲為定時回調(diào)。當(dāng)***次接收到觸摸結(jié)束事件時,我們設(shè)置一個回調(diào)。如果我們在回調(diào)之前接收到了第二次觸摸結(jié)束事件,我們可以判定用戶進行了雙擊,并取消回調(diào),執(zhí)行雙擊處理。我們接收到了回調(diào),我們認為用戶沒有進行雙擊并應(yīng)該進行單擊處理。
這里有表達兩種情況的例子:
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Initiate callback timer
- Time 200: TouchStart - numTaps (1) numTouches(1) Touches { (40,40) }
- Time 300: TouchEnd - numTaps (2) numTouches(1) Touches { (40,40) }
- Handle double-tap, cancel callback
這次,玩家進行了雙擊而且代碼進行了正確的處理。
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Initiate callback timer
- Time 500: Callback recieved
- Handle single-tap
現(xiàn)在,玩家進行了單擊而且代碼也進行了正確的處理。
注意,你不必為那些僅期待單擊事件的接口加上這些處理。
偵測諸如掃過的動作會更麻煩一點,但也更容易正確處理。代碼中必須為每次觸摸保存起始點與終點,并算出用戶劃的線的方向是向上、向下、向左、還是向右。還要判斷他的手劃過的是否足夠快。
小結(jié):iPhone 游戲開發(fā)教程 游戲引擎 (5)的內(nèi)容介紹完了,希望本文對你有所幫助!想要深入了解iPhone 游戲引擎的更多內(nèi)容,請參考以下幾篇文章: