WP7 XNA觸控與手勢
在手機上玩遊戲,最一般的控制方式就是觸控螢幕了!
WP7的觸控螢幕最少支援同時四點觸控,
在XNA裡,取得輸入的方式都很相像,
取得觸控資訊的方法是由TouchPanel物件管理,
用Touch..GetState()取得TouchCollection結構,因為至少支援四點觸控,所以式取得觸控的集合。
TouchCollection裡存放的是TouchLocation結構,他有三個重要成員,
Id表示第幾個觸碰點,Position表示觸碰位置,State表示觸碰狀態。
狀態有四種
Invalid | 出現錯誤 |
Moved | 移動 |
Pressed | 新的點被壓下 |
Released | 釋放 |
根據遊戲性質決定需要用到幾個點,程式碼可能的樣子如下
1: TouchCollection touchCollection = TouchPanel.GetState();
2: if (touchCollection.Count > 0) {
3: if (touchCollection[0].State == TouchLocationState.Pressed) {
4: ...
5: }
6: }
而有觸控就會出現所謂的手勢。
手勢是指藉由觸控方式的不同而達成的特殊按法。
WP7的手勢有以下幾種
Tap | 觸碰螢幕後放開,期間沒有發生移動。 |
DoubleTap | 快速觸碰螢幕同一點兩下。 |
Hold | 點住螢幕不放。 |
VerticalDrag | 垂直拖曳,點住螢幕後上下移動。 |
HorizontalDrag | 水平拖曳,點住螢幕後左右移動。 |
FreeDrag | 自由拖曳,點住螢幕後隨意移動。 |
DragComplete | 拖曳結束。 |
Flick | 感覺像是輕彈螢幕。 |
Pinch | 同時觸碰兩個地方後移動。 |
PinchComplete | Pinch結束。 |
取用的方式都相同,範例如下
1: while (TouchPanel.IsGestureAvailable) {
2: GestureSample gs = TouchPanel.ReadGesture();
3: if (gs.GestureType == GestureType.Tap) {
4: //做你想做的事...
5: }
6: }
迴圈的用意是因為可能會有多個手勢被觸發,產生的手勢會被存起來,藉由IsGestureAvailable來得知有沒有手勢可以取得。
而因為手勢的判斷必須特別處理,不是直接讀就有的,必須先開啟手勢判斷的功能,
在程式裡加入以下程式碼
1: TouchPanel.EnabledGestures = GestureType.Hold |
2: GestureType.Tap |
3: GestureType.DoubleTap |
4: GestureType.FreeDrag |
5: GestureType.Flick |
6: GestureType.Pinch;
這是把所有可以判斷的手勢都加入,因為判斷手勢會比較耗效能,所以盡可能地加入必要的就好。
而DragComplete 和PinchComplete 是結束時的狀態,不必加入。