检测多点触摸

在我的游戏中,我使用触摸事件来控制一个对象。当我触摸屏幕的右半部分时,对象会旋转;当我触摸屏幕的左半部分时,对象会移动。它在单点触摸时运行得很完美,但是当我同时在屏幕的任一侧开始触摸另一侧时,它会导致意外的、混淆的行为。

我猜我的问题是,如何将多个触摸区分开来。

 system.activate( "multitouch" )

    onTouch = function (event)

    if (event.phase == "began") then
        pX = event.x       -- 获取触摸的起始 X 坐标
        print( "ID:"..tostring(event.id) )
        if (event.x > centerX) then     -- 如果触摸在屏幕的右半部分或左半部分
            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 = {}         -- 用来存储触摸点的表

onTouch = function (event)

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

        print( "ID:"..tostring(event.id) )
        if (event.x > centerX) then     -- 如果触摸在屏幕的右半部分或左半部分
            touchID[event.id] = {}
            touchID[event.id].x = event.x
            xPos = "right"
            pX = touchID[event.id].x      -- 获取触摸的起始 X 坐标
        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

同样的问题仍然存在。

点赞
用户5675002
用户5675002

似乎你忽略了 event.id 字段,这就是为什么你的多点触控行为混乱的原因。

当你获取到 began 阶段时,通过将它存储在某个列表中来跟踪每一个新的触碰,包括触碰的初始坐标(pX 就在这里),以及你稍后可能需要的其他内容。当你获取到其他事件(moved/ended/cancelled)时,你应该检查活跃触碰的列表,通过 event.id 寻找实际触碰并对该精确触碰执行逻辑。

2016-10-22 21:10:17
用户5675002
用户5675002

你仍然在混淆触摸数据。 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

请注意,仍应在“ended/cancelled”阶段删除触摸。

编辑:可能会在屏幕的同一侧有多个触摸,因此可以忽略新触摸,或者以某种方式平均它们。

2016-10-23 19:01:29