【发布时间】:2017-01-10 12:33:36
【问题描述】:
在我正在构建的游戏中,用户可以通过在屏幕上拖动来移动相机,类似于滚动视图。这一切都由 touchesBegan 和 touchesMoved 方法在主场景文件中处理。但是,我还希望用户能够从 SKSpriteNode(实际上并不移动它)拖动到另一个 SKSpriteNode - 然后我基于 2 个节点执行操作。我可以分别做这两件事。但是当用户从一个节点拖动到另一个节点时,我不希望相机平移。
我再次设法使用在 touchesBegan 上设置的布尔标志解决了这个问题,如果他们触及了一个节点。但是,如果用户开始触摸其中一个精灵但完成了一个精灵,则屏幕不会平移,例如他们实际上快速执行了碰巧在节点上开始的平移。有人对此有什么好的解决方案吗?
我的一个想法是将所有触摸事件存储在 touchesMoved 中,然后在 touchesEnded 中循环遍历它们,执行相同的移动逻辑,前提是它们没有在精灵上开始和结束。例如
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch in touches {
movingTouches.append(touch)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if startedOnSprite && !endedOnSprite || !(startedOnSprite && endedOnSprite) {
let location = movingTouches.last().location(in: self)
let previousLocation = movingTouches.first().location(in: self)
let deltaY = location.y - previousLocation.y
let deltax = location.x - previousLocation.x
gameCamera?.position.y -= deltaY
view.frame.size.height
gameCamera?.position.y = (gameCamera?.position.y)! > viewHeight/2 ? viewHeight/2 : (gameCamera?.position.y)!
gameCamera?.position.y = (gameCamera?.position.y)! < -(viewHeight/2) ? -(viewHeight/2) : (gameCamera?.position.y)!
gameCamera?.position.x -= deltax
gameCamera?.position.x = (gameCamera?.position.x)! < -(viewWidth/2) ? -(viewWidth/2) : (gameCamera?.position.x)!
gameCamera?.position.x = (gameCamera?.position.x)! > (viewWidth/2) ? (viewWidth/2) : (gameCamera?.position.x)!
}
movingTouches = [UITouch]()
endedOnSprite = false
startedOnSprite = false
}
为了使事情复杂化,我还希望 Sprite 在它们上进行点击事件以及拖动。我正在努力寻找在 SpriteKit 中完成这一切的好方法
不幸的是,上面的内容根本不是很流畅,并且认为它似乎甚至没有滚动我期望的距离(如果我不担心它是否开始,完全相同的代码确实可以正确滚动一个精灵)
为了清楚起见,我想要滚动行为,前提是用户实际上并未使用手指从一个精灵“绘制”到另一个
【问题讨论】:
标签: sprite-kit sknode