XNA輸入輸出處理_第1頁
XNA輸入輸出處理_第2頁
XNA輸入輸出處理_第3頁
XNA輸入輸出處理_第4頁
XNA輸入輸出處理_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、XNA游戲開發(fā)常用輸入及輸出處理本課要點nXNA用戶輸入處理nXNA碰撞檢測nXNA聲音輸出3輸入類型 XNA中的用戶輸入可以由多種設(shè)備組合而成:鍵盤、鼠標、Xbox 360手柄、Xbox 360周邊設(shè)備和Windows Phone觸摸屏和加速器。注意鼠標輸入在Xbox 360和Windows Phone上不可用。本節(jié)課將講解如何為游戲添加對鍵盤,鼠標的支持。在之前的課程中,我們討論了輪詢和事件注冊。兩者之間的不同在處理輸入設(shè)備的時候最明顯。傳統(tǒng)的Windows程序員習(xí)慣于對事件進行注冊,比如某個鍵被按下或著鼠標移動。在這個編程模型中,應(yīng)用程序執(zhí)行一些功能,然后當(dāng)它空閑時,消息泵將消息送入應(yīng)用

2、程序并且事件被處理。在游戲開發(fā)中,沒有所謂的空閑時間,所以允許開發(fā)者進行事件注冊的開銷過大。取而代之是由開發(fā)者對輸入設(shè)備進行輪詢以得知玩家是否對這些設(shè)備進行了操作。4鍵盤輸入if(Keyboard.GetState( ).IsKeyDown(Keys.A) 鍵盤輸入是通過Microsoft.XNA.Framework.Input命名空間中的Keyboard類來處理的。Keyboard類有一個叫做GetState的靜態(tài)方法,用KeyboardState結(jié)構(gòu)的形式返回鍵盤目前的狀態(tài)。 5控制精靈自由移動KeyboardState keyboardState = Keyboard.GetState(

3、 ); if (keyboardState.IsKeyDown(Keys.Left) playerPosition.X -= speed; if (keyboardState.IsKeyDown(Keys.Right) playerPosition.X += speed; if (keyboardState.IsKeyDown(Keys.Up) playerPosition.Y -= speed; if (keyboardState.IsKeyDown(Keys.Down) playerPosition.Y += speed;為什么不用If else提高效率?如何確保按一次空格發(fā)射一枚炮彈?6

4、默認情況下當(dāng)鼠標劃過XNA游戲窗口時鼠標指針是隱藏的。如果您想在窗口中顯示鼠標,只要設(shè)置Game類的IsMouseVisible屬性為true就可以了。不管鼠標光標是否可見,GetState調(diào)用返回的MouseState結(jié)構(gòu)體都表示鼠標當(dāng)前的狀態(tài)。 MouseState結(jié)構(gòu)體中重要的屬性鼠標輸入本課要點nXNA用戶輸入處理nXNA碰撞檢測nXNA聲音輸出8碰撞檢測實現(xiàn)碰撞檢測最簡單和快速的方式是通過包圍盒算法。本質(zhì)上,當(dāng)用一個包圍盒算法時,您需要在屏幕上的每個物體周圍“畫”一個盒子,然后檢查這些盒子是否相交。如果相交,就有碰撞。實際游戲通常使用一個比實際幀尺寸稍微小一點的矩形,這樣將得到更加精

5、確的碰撞檢測:ringsRect.Intersects(skullRect);9使用多個包圍盒或者象素檢測將得到更加精確的碰撞檢測效果,但是性能會下降10像素檢測,對屏幕坐標上同一點的兩個對應(yīng)紋理中的亮度通道進行比較,只有兩個都不透明時才發(fā)生碰撞,檢測精準但是效率最差本課要點nXNA用戶輸入處理nXNA碰撞檢測nXNA聲音輸出12使用XACT“跨平臺音效制作工具”英文全稱Microsoft Cross Platform Audio Creation Tool,后文會使用它的英文縮寫簡稱XACT13在代碼中使用XACT聲音文件要從XACT項目文件中讀取數(shù)據(jù)到對象中讓您可以在XNA中播放聲音,您需

6、要添加以下成員變量到Game1類的頂部:AudioEngine audioEngine; WaveBank waveBank; SoundBank soundBank; Cue trackCue; 第一個變量代表一個稱為聲音引擎(sound engine)。這個對象會用來創(chuàng)建WaveBank和SoundBank對象,并且是XNA聲音的核心對象。WaveBank和SoundBank對象相當(dāng)于XACT文件的波形庫和聲音庫部分。Cue對象用來從聲音庫中取出獨立的cue來播放。14在代碼中使用XACT聲音文件一旦您添加了這些變量,就需要初始化它們。添加以下代碼到Game1的LoadContent方法中

7、:audioEngine = new AudioEngine(ContentAudioGameAudio.xgs); waveBank = new WaveBank(audioEngine, ContentAudioWave Bank.xwb); soundBank = new SoundBank(audioEngine, ContentAudioSound Bank.xsb);內(nèi)容管道為每個.xap文件(XACT項目文件)產(chǎn)生了一個.xgs文件。為項目文件中的每個聲音庫產(chǎn)生一個.xsb文件,為每個波形庫產(chǎn)生一個.xwb文件。這些文件通過代碼加載到各自對應(yīng)的對象中。注意聲音庫和波形庫對象同樣需

8、要聲音引擎對象傳入到它們的構(gòu)造方法中。最后,注意傳入構(gòu)造方法的參數(shù)是實際的路徑和文件名,而不是XNA中大多數(shù)資源用到的資源名。 trackCue = soundBank.GetCue(start);trackCue.Play();15在代碼中使用XACT聲音文件您需要做的最后一個修改,是每幀調(diào)用AudioEngine對象的Update方法,讓AudioEngine對象能夠與游戲保持同步。您可以在Game1類的Update方法中進行這項工作。如果忘記調(diào)用AudioEngine.Update,將會導(dǎo)致聲音變得不同步而產(chǎn)生問題。添加以下代碼到Game1類的Update方法中,位于base.Updat

9、e的調(diào)用之前: audioEngine.Update(); 16簡易聲音播放當(dāng)使用HiDef設(shè)置為Xbox 360和PC平臺開發(fā)游戲時,利用XACT提供的好處是明智的選擇。不過,“Reach”模式的游戲設(shè)置不支持XACT,所以XNA 4.0框架提供了一組簡化的音頻API,讓開發(fā)者可以在使用“Reach”的游戲設(shè)置時播放聲音。您同樣也可以在“HiDef”模式中使用簡化API,如果您不需要XACT提供的額外特性的話。XNA 4.0音頻API支持.wav,.wma和.mp3類型的文件17簡易聲音播放如果希望對音效有更多的控制權(quán),諸如在結(jié)束之前循環(huán)、停止聲音播放的能力,您需要調(diào)用SoundEffectInstance對象。它被SoundEffect類所調(diào)用的一個叫CreateInstance的對象捕獲了。通過SoundEffectInstance,您可以循環(huán)播放聲音、調(diào)節(jié)音量、停止和恢復(fù)聲音播放甚至更多。 Sou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論