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 中的水平滚动(与视图控制器相比)的主要内容,如果未能解决你的问题,请参考以下文章