SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心

Posted

技术标签:

【中文标题】SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心【英文标题】:SpriteKit - Mouse Snaps to Center On Sprite Drag 【发布时间】:2015-08-25 06:04:01 【问题描述】:

我正在尝试创建一个 ios 游戏,并且我拥有它,以便在触摸和移动项目时拖动它。当它被拖动时,鼠标会捕捉到精灵的中心。我怎样才能做到这一点,这样就不会发生?

Here 是正在发生的事情的一个例子。

这里是处理触摸输入的函数

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) 

    var papers = 0

    for touch in (touches as! Set<UITouch>) 
        let location = touch.locationInNode(self)
        let touchedNode = nodeAtPoint(location)

        if ((touchedNode.name?.contains("paper")) != nil) 

            touchedNode.position = location
            touchedNode.position.x = CGRectGetMidX(self.frame)
        
    

override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) 
        for touch: AnyObject in touches 
            let location = touch.locationInNode(self)
            let touchedNode = nodeAtPoint(location)

            if ((touchedNode.name?.contains("paper")) != nil) 

                touchedNode.position = location
                touchedNode.position.x = CGRectGetMidX(self.frame)
            
        
    

override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) 
    for touch: AnyObject in touches 
        let location = touch.locationInNode(self)
        let touchedNode = nodeAtPoint(location)
        if ((touchedNode.name?.contains("paper")) != nil) 
            touchedNode.zPosition = 0
            touchedNode.position.x = CGRectGetMidX(self.frame)
        
    

附: contains 是 String 类的扩展,用于检查子字符串是否在字符串中

提前致谢!

【问题讨论】:

【参考方案1】:

从触摸位置而不是从精灵的中心拖动精灵相当简单。为此,请计算并存储触摸位置与精灵中心之间的差异(即偏移量)。然后,在touchesMoved 中,将精灵的新位置设置为触摸位置加上偏移量。

您可以选择重载+- 运算符以简化加法和减法CGPoints。在 GameScene 类之外定义这个:

func - (left:CGPoint,right:CGPoint) -> CGPoint 
    return CGPoint(x: right.x-left.x, y: right.y-left.y)


func + (left:CGPoint,right:CGPoint) -> CGPoint 
    return CGPoint(x: right.x+left.x, y: right.y+left.y)

在GameScene中,定义如下实例变量

var offset:CGPoint?

然后在touchesBegan,替换

touchedNode.position = location

offset = location - touchedNode.position

touchesMoved 中,替换

touchedNode.position = location

if let offset = self.offset 
    touchedNode.position = location + offset

我概括了解决精灵在xy 维度中的位置偏移的解决方案。在您的应用中,您可以简单地偏移精灵的y 位置,因为x 被忽略了。

【讨论】:

非常感谢!我被困了一段时间!【参考方案2】:

为此,您不需要 touchesBegan 和 touchesEnded。您可以只使用 touchesMoved:

for touch: AnyObject in touches 
        let location = touch.locationInNode(self)
        let touchedNode = nodeAtPoint(location)
        let previousPosition = touch.previousLocationInNode(self)

        if (touchedNode.name == "paper") 

            var translation:CGPoint = CGPoint(x: location.x - previousPosition.x , y: location.y - previousPosition.y )

            touchedNode.position = CGPoint(x: touchedNode.position.x , y: touchedNode.position.y + translation.y)


        
    

这个想法是计算翻译。您可以阅读有关此解决方案的更多信息here。对于未来的读者,可以在 on this link 找到 *** 上的 Obj-C 解决方案。

【讨论】:

以上是关于SpriteKit - 鼠标在 Sprite 拖动时捕捉到中心的主要内容,如果未能解决你的问题,请参考以下文章

阻止 Sprite 在 SpriteKit 中相互推动

Sprite不会用手指/ SpriteKit / Swift 3移动

SpriteKit Sprite 无法正确缩放

在Sprite纹理中检测触摸而不是整个框架iOS Swift SpriteKit?

Sprite Kit,删除 Sprite 以进行碰撞

在 Sprite Kit 中混合颜色