在我正在构建的游戏中,用户可以通过在屏幕上拖动来移动相机,类似于滚动视图。这都是由touchesBegan和touchesMoved方法在主场景文件中处理的。但是我还希望用户能够从SKSpriteNode(实际上没有移动它)拖动到另一个SKSpriteNode - 然后我根据2个节点执行操作。我可以分别做这两件事。但是当用户从一个节点拖动到另一个节点时,我不希望相机平移。
我再次设法使用在touchesBegan上设置的布尔标志来解决这个问题,如果他们触摸了一个节点。然而,如果用户开始触摸其中一个精灵但是完成一个精灵,则屏幕不会平移,例如他们实际上快速执行恰好在节点上开始的平底锅。有没有人对此有任何好的解决方案?
我有一个想法是将所有触摸事件存储在touchesMoved中,然后在touchesEnded中循环执行它们执行相同的移动逻辑,前提是它们没有以精灵开始和结束。 e.g
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
}
为了使问题复杂化,我还希望Sprites能够对它们进行点击事件以及拖动。我正在努力寻找一种在SpriteKit中完成所有这些工作的好方法
不幸的是,上面根本不是很平滑,并且认为它似乎甚至没有滚动我期望的距离(完全相同的代码确实滚动,如果我不打扰它是否开始一个精灵)
所以要清楚,我想要滚动行为,前提是用户实际上没有用手指从一个精灵'画'到另一个精灵