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
中,将精灵的新位置设置为触摸位置加上偏移量。
您可以选择重载+
和-
运算符以简化加法和减法CGPoint
s。在 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
我概括了解决精灵在x
和y
维度中的位置偏移的解决方案。在您的应用中,您可以简单地偏移精灵的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 / Swift 3移动