2016-10-22 102 views
0

在我的遊戲中,我使用觸摸事件來控制對象。當我觸摸屏幕的右半部分時,對象旋轉,當我觸摸屏幕的左半部分時,對象移動。當它是單點觸摸時,它可以很好地工作,但是當我觸摸屏幕的任何一側,然後同時開始觸摸另一側時,就會產生意想不到的混合行爲。檢測多個觸摸

我想我的問題是,如何分離或區分多個觸摸之一。

system.activate("multitouch") 

    onTouch = function (event) 

    if (event.phase == "began") then 
     pX = event.x  -- Get start X position of the touch 
     print("ID:"..tostring(event.id)) 
     if (event.x > centerX) then  --if the touch is in the right or left half of the screen 
      xPos = "right" 
     else 
      xPos = "left" 
     end 

    elseif (event.phase == "moved") then 
     local dX = (event.x - pX) 
     if (xPos == "right") then 
      rotatePlayer(dx) 
     else 
      movePlayer(dX) 
    end 

更新:

system.activate("multitouch") 

local touchID = {}   --Table to hold touches 

onTouch = function (event) 

    if (event.phase == "began") then 

     print("ID:"..tostring(event.id)) 
     if (event.x > centerX) then  --if the touch is in the right or left half of the screen 
      touchID[event.id] = {} 
      touchID[event.id].x = event.x 
      xPos = "right" 
      pX = touchID[event.id].x  -- Get start X position of the touch 
     else 
      touchID[event.id] = {} 
      touchID[event.id].x = event.x 
      xPos = "left" 
      pX = touchID[event.id].x 
     end 

    elseif (event.phase == "moved") then 
     print("ID:"..tostring(event.id)) 

     local dX 
     if (xPos == "right") then 
      touchID[event.id].x = event.x 
      dX = touchID[event.id].x - pX 
      rotatePlayer(dx) 
     else 
      touchID[event.id].x = event.x 
      dX = touchID[event.id].x - pX 
      movePlayer(dX) 
    end 

同樣的問題依然存在。

回答

0

似乎你忽略了event.id字段,這就是爲什麼你有多個觸摸行爲混合起來。

當您獲得began階段時,通過將其存儲在某個列表中來跟蹤每個新觸摸。包括觸摸初始座標(你的pX去那裏)和其他任何你可能需要的東西。當您收到其他活動(移動/結束/取消)時,您應該檢查活動觸摸列表,找到event.id的實際觸摸並執行確切觸摸的邏輯。

+0

我嘗試將觸摸ID添加到表中,並讓它們的觸摸移動,但同樣的問題仍然存在。請檢查我更新的問題。 – Abdou023

0

您仍在混合觸摸數據。 xPos是一個觸摸功能,所以它必須存儲在觸摸事件中,而不是全局變量,它會被另一個觸摸中的數據更新。

另外,從if分支中移出重複的行,它們是相同的。代碼將變得更簡單,更容易閱讀和理解。

system.activate("multitouch") 

local touchID = {}   --Table to hold touches 

onTouch = function (event) 
    local x, id, phase = event.x, event.id, event.phase 
    print("ID:"..tostring(id)) 

    if (phase == "began") then 
     touchID[id] = { 
      x = x, 
      logic = (x > centerX) and rotatePlayer or movePlayer 
     } 
    elseif (phase == "moved") then 
     local touch = touchID[id] 
     touch.logic(x - touch.x) 
    end 
end 

請注意,您仍應刪除「結束/取消」階段的觸摸。

編輯:在屏幕的同一側可能會有多個觸摸,所以要麼忽略新的觸摸,要麼以某種方式平均它們。