我有一个对于视图而言太大的SKSpriteNode,而我正在寻找Sprite Kit中的一种简单方法来水平滚动以便能够完全看到它。
谢谢!
答案 0 :(得分:1)
你可以尝试使用SKCameraNode
并回复像这样的平移手势:
// GameScene.swift
override func didMove(to view: SKView) {
self.camera = SKCameraNode()
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePanFrom(recognizer:)))
panGestureRecognizer.maximumNumberOfTouches = 1
view.addGestureRecognizer(panGestureRecognizer)
}
func handlePanFrom(recognizer: UIPanGestureRecognizer) {
if recognizer.state != .changed {
return
}
// Get touch delta
let translation = recognizer.translation(in: recognizer.view!)
// Move camera
self.camera?.position.x -= translation.x
self.camera?.position.y += translation.y
// Reset
recognizer.setTranslation(CGPoint.zero, in: recognizer.view)
}
答案 1 :(得分:0)
获得简洁的类似滚动视图的UX的最简单方法是...使用滚动视图。在您的SKSceneView中嵌套一个:
Scene View
|-Scroll View
然后,您需要根据场景宽度和视口宽度设置contentSize
的滚动视图。在这里,您应该根据场景的scaleMode
和布局的其他特定功能进行一些相应的计算。
Raywenderlich提供了有关该主题的非常好的课程:
Scroll View School Part 13: Sprite Kit Integration
Scroll View School Part 14: Sprite Kit Level Selector
这些课程非常好,因为它们非常详细。他们会告诉您如何正确转换坐标。但是,有些东西并不理想:例如,您不需要向滚动视图添加内容视图,只需设置contentSize
就可以了。另外,我建议使用SKCameraNode
而不是将所有内容都放在根“ world”节点中。
此后,您必须收听滚动视图的delegate
:
// Example from one of my games
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let scrollWidth = scrollView.contentSize.width - scrollView.bounds.width
guard scrollWidth > 0.01 else { return }
let relativePosX = scrollView.contentOffset.x / scrollWidth
// Feed relative position to the scene.
// `setCameraRelativePosition` will convert it into the absolute camera
// coordinates in the scene coordinate space
gameScene.setCameraRelativePosition(relativePosX)
}
...并根据需要更新您的地图或相机位置。
UIPanGestureRecognizer
永远不会像本地Scroll View那样减速和弹跳。