SpriteKit 中的水平滚动(与视图控制器相比)

Posted

技术标签:

【中文标题】SpriteKit 中的水平滚动(与视图控制器相比)【英文标题】:Horizontal scrolling in SpriteKit (vs. a viewcontroller) 【发布时间】:2016-06-03 01:33:17 【问题描述】:

我对处理这个问题的正确方法有点困惑:

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

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

迄今为止,我的游戏的所有功能都是使用 SpriteKit 实现的(我只有一个视图控制器,除了在其中展示我的所有 SKScenes 之外我不使用它)。

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

我宁愿保持一致并且只使用与 SKView 相关的代码,但我是否会通过允许滑动/滚动来重新创建 UICollectionView?谁能推荐一种在 SpriteKit 中执行此操作的方法,或者您会说这通常是一个坏主意吗?

非常感谢!

【问题讨论】:

最好的方法是集合视图,但它根本不在 SpriteKit 框架中,它只是基础的一部分。 【参考方案1】:

要纯粹在 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,例如如何创建自定义单元格和常规设置等。您还必须确保在更改 SKScenes 时删除 collectionView

 collectionView.removeFromSuperview()

这是你要问的吗?

【讨论】:

正是我要问的,但我有一个问题 - 如何添加 SKNode 或与我的节点交互?我创建了一个工厂类,它根据上下文返回项目的数量。所以我的 collectionView 可以只查询工厂来获取这个数组(或计数)。但是如何在 collectionView 中呈现项目?谢谢! 您必须创建一个自定义单元格,然后添加您的标签、图像等以显示在集合视图中。这是一本关于如何做到这一点的好书randexdev.com/2014/08/uicollectionviewcell 他的意思是你的代码与SpriteKit没有任何关系。它可以工作,但其中没有与 SpriteKit 相关的内容。基本上,您可以告诉他使用 UICollectionView,它与您的代码没有什么不同。他们都还在使用 UIKit。 是的,这是真的。只是在极少数情况下,使用 UIKit IMO 实际上更容易。当你创建一个 moveableNode 并移动它并在 touchesMoved 中跟踪它时,他可以做那些尴尬的黑客攻击。它很尴尬,你也没有得到很好的反弹/滚动效果。我确实通过指向仅 SpriteKit 解决方案的链接更新了我的答案。 @crashoverride777 很抱歉挖掘了一篇旧帖子,但您能否提供指向您的 collectionview github 项目的链接,因为我无法使用您在它不断给我的答案中提供的 collectionview 类所有这些错误,想知道您是否可以提供更新版本。你认为在 spritekit 中工作时使用 UIcollectionview 是否值得,因为我听说它会导致游戏运行速度变慢。感谢您的帮助。【参考方案2】:

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

然后只需使用滑动手势来捕捉滑动,并编写一些代码来处理您希望滚动发生的方式。我不太熟悉UICollectionView 的滚动方式,所以我无法回答您如何让它感觉相同。

【讨论】:

你能举个例子吗?这对我和未来的开发者会有帮助

以上是关于SpriteKit 中的水平滚动(与视图控制器相比)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit 中制作水平滚动字符选择器

禁用滚动视图中的反弹禁用 pageView 控制器中的水平滚动

滚动视图不水平滚动

UITableView 水平滚动指示器

我的水平滚动视图不起作用

我无法在 Swift Xcode 的视图控制器中集成水平滚动视图