SpriteKit中的水平滚动(与viewcontroller相比)

时间:2016-02-21 18:04:39

标签: swift sprite-kit swift2 skview

我对解决这个问题的正确方法感到有些困惑:

在我的游戏中,我允许玩家从5个区域中进行选择。区域只不过是屏幕上的一个矩形,其中包含您在该区域内完成的百分比。整个列表都居中并且看起来很好。

..最终会有更多区域,但我不希望它们在多行上(我希望玩家可以滑动以滚动它们)。

到目前为止,我游戏中所有的功能都是使用SpriteKit(我只有一个视图控制器,除了将所有SKScenes呈现在其中之外我不使用它)。

为了实现上述所需的功能,我现在需要引入一个带有UICollectionView的视图控制器吗?

我宁愿保持一致,只使用与SKView相关的代码,但我实际上是通过允许滑动/滚动来重新创建UICollectionView吗?任何人都可以推荐一种方法在SpriteKit中这样做,或者你会说这通常是一个坏主意吗?

非常感谢!

2 个答案:

答案 0 :(得分:3)

要在SpriteKit中完全执行此操作,您基本上创建了一个moveableNode并将所有菜单内容添加到该节点,而不是在touchesMoved中移动该节点。你必须跟踪它的位置并调整速度等。

https://codedump.io/share/etvt4SwQI6iR/1/how-to-create-a-vertical-scrolling-menu-in-spritekit

我认为这种菜单是一种罕见的情况,在SpriteKit中使用UIKit实际上更好,例如UIScrollViews或UICollectionViews。

尝试在SpriteKit中复制它们有点棘手,需要一些额外的代码,并且不会给你很好的滚动/反弹效果。

你可以在Spritekit中创建一个UIColletionView,如果这就是你要找的东西,你只需要子类。我正在使用一个我正在进行的游戏作为关卡选择屏幕。

创建一个新的swift文件

class CustomCollectionView: UICollectionView {

// MARK: - Init
init(frame: CGRect) {
    super.init(frame: frame)

    /// set up
    backgroundColor = UIColor.clearColor()
    #if os(iOS)
    pagingEnabled = true
    #endif
    self.frame = frame
    delegate = self
    dataSource = self
    indicatorStyle = .White
    scrollEnabled = true
    canCancelContentTouches = false

    registerClass... // register your cells
 }

// MARK: - Delegates
extension CustomCollectionView: UICollectionViewDataSource {

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 5
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 8
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
 .......
 }

然后在您的SKScenes中,您可以添加集合视图

  weak var collectionView: CustomCollectionView!

  collectionView = CustomCollectionView(frame: view!.frame)
  view!.addSubview(collectionView)

您必须阅读一些教程,以便您可以熟悉UICollectionView,如何创建自定义单元格和常规setUp等。您还必须确保在更改SKScenes时删除collectionView

 collectionView.removeFromSuperview()

这是你要问的吗?

答案 1 :(得分:3)

如果您希望使用SpriteKit代码执行此操作,只需创建一个SKNode,将所有内容放在此SKNode中,如果您有可视空间来查看所有内容,请按照您希望的方式布局,然后根据您的预期方向移动节点的位置。 (在您的情况下,您想移动SKNodes x位置)

然后只需使用滑动手势捕获滑动,并编写一些代码来处理滚动发生的方式。我对UICollectionView的滚动方式不太熟悉,所以我不能给你一个如何让它有同样感觉的答案。