当前位置: 首页 > 面试题库 >

Sprite Kit中的多点触控手势

郎聪
2023-03-14
问题内容

我正在使用使用XCode 6的Sprite-
Kit在Swift中工作,我有许多不同的节点,但是目前,我只能设法检测到一根手指并同时移动一个节点。我想知道如何设法检测多个手指以便同时移动多个节点。我的实际代码是:

var location = CGFloat() // finger position
var actualNode = -1 // node touched by the finger, -1 means no node touched

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) // when a finger touch the screen
{
    for touch: AnyObject in touches
    {
        location = touch.locationInNode(self) // we detect the finger position
    }

    for var index = 0; index < colorNode.count; index++
    {
        if nodeAtPoint(location) == colorNode[index].node
        {
            actualNode = index // the number of the node touched by the finger
        }
    }
}

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) // when a finger move
{
    for touch: AnyObject in touches
    {
        location = touch.locationInNode(self) // we detect the finger position
    }

    if actualNode != -1 // if a node is touched
    {
        colorNode[actualNode].position = location // we move this node to the finger
    }
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) // when a finger don't touch the screen anymore
{        
    actualNode = -1 // there is no node touched
}

如您所见,我只有position第一根手指的手指,但是如何检测多个手指的位置并将每个手指分配给手指触摸的节点?


问题答案:

同时移动多个节点非常简单。关键是要独立跟踪每个触摸事件。一种方法是维护一个字典,该字典使用touch事件作为键,并使用要移动的节点作为值。

首先,声明字典

var selectedNodes:[UITouch:SKSpriteNode] = [:]

以touch事件为键,将每个触摸的精灵添加到字典中

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in:self)
        if let node = self.atPoint(location) as? SKSpriteNode {
            // Assumes sprites are named "sprite"
            if (node.name == "sprite") {
                selectedNodes[touch] = node
            }
        }
    }
}

根据需要更新子画面的位置

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        let location = touch.location(in:self)
        // Update the position of the sprites
        if let node = selectedNodes[touch] {
            node.position = location
        }
    }
}

触摸结束后,从字典中删除精灵

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch in touches {
        if selectedNodes[touch] != nil {
            selectedNodes[touch] = nil
        }
    }
}


 类似资料:
  • 在适用于 Windows 8 系统的 Photoshop CC 2014 版中启用了触控手势。Photoshop 可在连接到系统的任何支持多点触控的数字化设备(包括直接触控显示屏和外部平板电脑)上识别其自定义手势。在随许多笔记本电脑系统提供的触摸板指点设备上无法识别自定义 Photoshop 手势。您可以使用支持两个或更多同步触点的设备控制 Photoshop。 在 Photoshop 中,双指触

  • 问题内容: 我有一个自定义类,它是一个SKNode,而其中又包含几个SKSpriteNodes。有什么方法可以从我的游戏场景中检测到这些子SKSpriteNode上的触摸? 我工作很快 问题答案: 资料来源:http : //www.raywenderlich.com/84434/sprite-kit-swift-tutorial- beginners

  • 问题内容: 我有一个触摸事件异常,导致我的游戏在平板电脑(或更具体地,蜂窝)上崩溃…我的游戏在手机上正常运行,而且我没有听说过任何未运行Android 3.0的人都在发生这种情况或更高。这是相关的日志信息… …这是调用它的代码。对我来说似乎不错,但也许蜂窝中有一个尚未修复的错误?上面日志中的行号665对应于该行。它可能与我获取变量的方式有关吗?但它在手机/ 2.3及更低版本上工作正常… 当我试图将

  • 问题内容: 更新: 我已经解决了这个问题,并且找到了一个比提供答案更简单的方法。我的解决方案是使SPACESHIP的速度等于从手指触摸到的距离。为了加快运动速度,可以将该速度乘以一个常数。在这种情况下,我使用了16。我还摆脱了在touchesEnd事件中将lastTouch设置为nil的问题。这样,即使我松开手指,船仍会停下来。 =============================== 我有

  • 本文向大家介绍Android开发实例之多点触控程序,包括了Android开发实例之多点触控程序的使用技巧和注意事项,需要的朋友参考一下        智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣。实际上多点触控程序的实现并不是那么遥不可及,而是比较容易。本文就主要通过一个实例具体讲解多点触控程序的实现。        首先来了解一

  • 5.多触点归因 一、多触点归因 还原用户归因媒体前所接触的媒体轨迹,计算每一个媒体贡献的转化情况,从而全面科学的评估广告媒体效果进而优化广告资源配比,提升广告效果转化率。 二、功能介绍 多触点归因: 应用在某个设备第一次激活,除去归因渠道,辅助窗口期(默认30天)内辅助转化的渠道。 转化路径: 应用在某个设备第一次激活,回溯30天内用户接触的所有推广渠道,并按照时间顺序排列; 所选时间范围内统计T