WP7 XNA觸控與手勢

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 是結束時的狀態,不必加入。