Windows Phone 7范例游戏Platformer实战5——多点触控编程
即使是再有經(jīng)驗(yàn)的XNA程序員,在開(kāi)始Windows Phone 7上的游戲開(kāi)發(fā)時(shí)也不得不學(xué)習(xí)下多點(diǎn)觸控這個(gè)新的實(shí)現(xiàn)方法。雖然目前有些Windows Phone 7手機(jī)附帶了鍵盤(pán),但是為了對(duì)所有WP7手機(jī)兼容,我們的游戲最好能全部采用多點(diǎn)觸控這種輸入方法。
?
目前在Windows Phone 7平臺(tái)上的熱銷(xiāo)游戲包括“刺客信條”、“極品飛車(chē)”、“巴比倫兄弟”都是采用觸控和加速度傳感器的操作方式。這對(duì)于Windows平臺(tái)的程序員來(lái)說(shuō)可謂是一個(gè)全新的模式。
?
??????????????????????????????????? 刺客信條使用多點(diǎn)觸控實(shí)現(xiàn)英雄的移動(dòng)、攻擊和武器切換
Windows Phone 7采用最少支持4個(gè)觸點(diǎn)的電容屏,它不再是以前仿真手筆和識(shí)別手寫(xiě)筆那么簡(jiǎn)單,如何處理多點(diǎn)觸控成為開(kāi)發(fā)人員的新挑戰(zhàn)。在XNA編程中,多點(diǎn)觸控輸入會(huì)在XNA的Update()方法中被偵測(cè),Update()方法的一個(gè)主要目的就是處理多點(diǎn)觸控的輸入,并將輸入導(dǎo)致的更改用Draw()方法繪制在屏幕上。
XNA中的底層多點(diǎn)觸控輸入處理
?
在XNA中,多點(diǎn)觸控設(shè)備被抽象為一個(gè)觸控面板(Touch Panel),你可以使用TouchPanel這個(gè)靜態(tài)類(lèi)中的方法來(lái)獲得觸點(diǎn)的信息。盡管多點(diǎn)觸控還存在滑動(dòng)等手勢(shì)的識(shí)別,但是我們還是從最底層的觸控輸入的處理開(kāi)始學(xué)起。
?
我們可以用TouchPanel.GetCapabilities()這個(gè)方法來(lái)獲取觸摸屏的一些特性,這個(gè)方法返回的TouchPanelCapabilities對(duì)象包含兩個(gè)屬性。分別如下:
?
IsConnected:查看是否和觸摸屏設(shè)備進(jìn)行連接。因?yàn)閃P7手機(jī)總是存在觸摸屏的,所以該屬性總是返回true。
MaximumTouchCount:該屬性返回WP7手機(jī)電容屏支持的最大觸點(diǎn)個(gè)數(shù),對(duì)于Windows Phone 7來(lái)說(shuō)這個(gè)屬性最小值為4,也就是同時(shí)支持最少4個(gè)觸點(diǎn)。
?
一般說(shuō)來(lái),我們只需要使用TouchPanel中的兩個(gè)靜態(tài)方法。為了獲取底層的觸控輸入信息,你可以在Update()方法中使用如下的方法:
?
TouchCollection?touchLocations?=?TouchPanel.GetState();?
TouchPanel.GetState()方法返回的是一個(gè)觸點(diǎn)集合,該集合包含0個(gè)或者多個(gè)TouchLocation對(duì)象。TouchLocation對(duì)象包含三個(gè)重要屬性:
?
State:該屬性是TouchLocation的枚舉成員,包含Pressed、Moved和Released三種狀態(tài)。分別對(duì)應(yīng)觸點(diǎn)當(dāng)前是否按下、移動(dòng)和釋放。
Position:該屬性是一個(gè)Vector2是矢量坐標(biāo),用于確認(rèn)當(dāng)前觸點(diǎn)相對(duì)于左上角的坐標(biāo)位置。
Id:該屬性是一個(gè)Int的整型數(shù)字,用于標(biāo)示每個(gè)由按下到釋放狀態(tài)的手指。
?
如果觸摸屏上沒(méi)有任何的手指按下,那么TouchCollection為空。一旦有某個(gè)手指和觸摸屏接觸,TouchCollection將包含一個(gè)State屬性為Pressed的TouchLocation對(duì)象。
?
在下一次TouchPanel.GetState()方法調(diào)用中,即使你的手指沒(méi)有移動(dòng),TouchLocation的State屬性也將更改為Moved。一旦你的手指離開(kāi)觸摸屏,TouchLocation的State屬性毋庸置疑,狀態(tài)為Released了。在接下來(lái)的TouchPanel.GetState()方法調(diào)用中,TouchCollection又將為空。
?
這里也有個(gè)特例,就是當(dāng)你在1/30秒的時(shí)間內(nèi),完成手指在觸摸屏上由按下到釋放的過(guò)程,那么TouchLocation的State屬性將會(huì)由Pressed直接變更為Released,跳過(guò)了Moved這個(gè)過(guò)程。估計(jì)沒(méi)幾個(gè)人手指可以在觸摸屏上如此神速,1/30秒呢?嘿嘿,要不你試試。
?
一般來(lái)說(shuō),我們可能會(huì)使用多個(gè)手指在WP7電容屏上實(shí)現(xiàn)各種操作,每個(gè)手指都可以獨(dú)立地實(shí)現(xiàn)按下、移動(dòng)和釋放的過(guò)程。
?
如何對(duì)多個(gè)手指進(jìn)行標(biāo)示以便實(shí)現(xiàn)相應(yīng)狀態(tài)的跟蹤,這里就需要使用前面提及的TouchLocation.Id屬性了。每個(gè)觸控屏上的手指都將用一個(gè)特定的Id進(jìn)行標(biāo)示,以便確認(rèn)是那個(gè)手指的Pressed、Moved和Released狀態(tài)。
?
TouchLocation還存在一個(gè)非常有用的TryGetPreviousLocation()方法,調(diào)用代碼:
?
TouchLocation?previousTouchLocation;bool?success?=?touchLocation.TryGetPreviousLocation(out?previousTouchLocation);
?
我們可以在touchLocation.State等于Moved時(shí)調(diào)用該方法,這樣你可以獲取先前的觸點(diǎn)位置,并計(jì)算手指移動(dòng)的距離。如果touchLocation.State等于Pressed,TryGetPreviousLocation()方法將返回false,而previousTouchLocation.State的值將為T(mén)ouchLocationState.Invalid。
到目前為止,我們大致了解了WP7上多點(diǎn)觸控的實(shí)現(xiàn)和編程方法,在Platformer游戲中,英雄的移動(dòng)和跳躍分別是由加速度傳感器和觸摸屏控制的。點(diǎn)擊手機(jī)屏幕,英雄將會(huì)跳躍,而左右傾斜手機(jī),加速度傳感器就會(huì)判定英雄是向左還是向右移動(dòng)。
?
下面就是Platformer游戲中多點(diǎn)觸控的封裝方法,具體的使用軒轅將在后續(xù)文章的游戲場(chǎng)景繪制中重點(diǎn)介紹。代碼依然是一如既往的短小精悍:
?
?1?????///?<summary>?2?????///?對(duì)TouchCollection的擴(kuò)展
?3?????///?</summary>
?4?????public?static?class?TouchCollectionExtensions
?5?????{
?6?????????///?<summary>
?7?????????///?確定觸摸屏是否存在觸點(diǎn)
?8?????????///?</summary>
?9?????????///?<param?name="touchState">當(dāng)前TouchCollection集合</param>
10?????????///?<returns>如果存在觸點(diǎn)狀態(tài)為Pressed或Moved,返回true,反之為false</returns>
11?????????public?static?bool?AnyTouch(this?TouchCollection?touchState)
12?????????{
13?????????????foreach?(TouchLocation?location?in?touchState)
14?????????????{
15?????????????????if?(location.State?==?TouchLocationState.Pressed?||?location.State?==?TouchLocationState.Moved)
16?????????????????{
17?????????????????????return?true;
18?????????????????}
19?????????????}
20?????????????return?false;
21?????????}
22?????}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/imobiler/archive/2010/12/10/1901850.html
總結(jié)
以上是生活随笔為你收集整理的Windows Phone 7范例游戏Platformer实战5——多点触控编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Web 标准实战的评论
- 下一篇: DELAY INIT 延迟初始化