Unity簡易八方手勢判斷

有BUG的手勢......
如果刻意將其它沒有要判斷的手指放在上面會無法正常運行
由於Blogger在判斷大於小於會錯誤,在此放上截圖供對照。


判斷邏輯與簡易版程式碼





#pragma strict
// 宣告進入、離開觸控位置陣列
var startPos : Vector2[];
var endPos : Vector2[];
// 公開變數 宣告手勢方向
static var gesturesDir:Vector2 = Vector2.zero;

// 設定觸控陣列長度為5
function Start(){
   startPos = new Vector2[5];
   endPos = new Vector2[5];
}


function Update () {
// 假使 觸控點大於1
if (Input.touchCount > 0)
{
// 進行迴圈判斷
for (var h = 0; h < Input.touchCount;++h)
{
// 將觸碰進入點座標放置相對應陣列
if (Input.GetTouch(h).phase == TouchPhase.Began)
{
startPos[h] = Input.GetTouch(h).position;
}
// 將觸碰離開點座標放置相對應陣列
if (Input.GetTouch(h).phase == TouchPhase.Ended)
{
endPos[h] = Input.GetTouch(h).position;
GesturesCtrl(startPos[h],endPos[h]);
}
}
}
}

function GesturesCtrl (startPoint:Vector2,endPoint:Vector2){
var xDiff : float = endPoint.x - startPoint.x;
var yDiff : float = endPoint.y - startPoint.y;
var slope : float = Mathf.Abs(yDiff / xDiff);
// 宣告 垂直 水平 布林,上、右為真
var verticalBool:int; // 上 1 下 -1
var horizontal:int; // 右 1 左 -1
// 宣告 方向
// 判斷水平方向,大於0則於上方1、小於0則為下方-1,否則可能水平移動0
if (yDiff>0){
verticalBool = 1;
}else if(yDiff<0 p="">
verticalBool = -1;
}else{
verticalBool = 0;
}
// 判斷水平方向,大於0則於右方1、小於0則為左方-1,否則可能垂直移動0
if (xDiff>0){
horizontal = 1;
}else if(xDiff<0 span=""> horizontal = -1;
}else{
horizontal = 0;
}
print(slope);
// 假使 斜率 大於 2 則為 純 垂直方向
if (slope>2){ gesturesDir.y = verticalBool;
gesturesDir.x = 0;
// 假使 斜率 小於 0.5 則為 純 水平方向
}else if(slope<0 .5="" p="">
gesturesDir.x = horizontal;
gesturesDir.y = 0;
// 假使 [斜率 落於 2,0.5之間 則為斜向] 或 [傾斜角非90度(x相減不為零) 則為水平(機率低但發生則因yDiff判斷為0而成立為純水平方向,又已於xDiff判斷水平方向)]
}else{
gesturesDir.x = horizontal;
gesturesDir.y = verticalBool;
}
print(gesturesDir);
}


邏輯參考網站
http://blog.happybean.tw/blog/2012/07/04/javascript-yi-liang-dian-zuo-biao-qiu-qi-jiao-du-yu-lian-xian-zhi-chui-zhi-xiang-liang-fang-xiang

留言

這個網誌中的熱門文章

參加畢業展之設計類展場小心得

Unity 判斷兩物之間距離、角度,並注視目標

Action Game Maker 1.03 正體中文漢化版