SpriteKit 中的 ScrollView

Bez*_*ezz 5 xcode uiscrollview ios sprite-kit swift

我发现了一些与此类似的其他问题和答案,但没有一个对我来说非常完美。

我的愿景是在屏幕底部有一个水平可滚动视图,我可以在其中滚动浏览看起来像手中的卡片的内容。理想情况下,我最终可以将中间的卡片放大一点,并使其具有突出显示的外观,以向用户显示选择了哪张卡片。如果我能弄清楚如何保持滚动视图的大小调整以适应视图中精灵(卡片)的数量,那就更好了。

不管怎样,我对 XCode 和 Swift 还很陌生,所以我很难接受我发现的东西并改变它。但是,我希望能够快速学习。

到目前为止我所理解的是 UIScrollView 可以覆盖场景,并且使用可移动的 spritenode 我可以滚动视图。然后,视图将以某种方式将坐标转换为 SpriteKit 场景,以移动精灵,使其看起来像在视图中一样。我想这就是它的运作方式。任何帮助都会很棒。我很困惑。<3

Flu*_*ity 2

touchesMoved()您必须创建自己的使用全局/成员变量时发生的逻辑。

不幸的是,很多 gamedev 和 SK 都是数学和逻辑。你必须想出自己的问题和解决方案。没有手册,因为编程和 Swift 的可能性是无限的:)


移动卡片:

基本上,您将每个touch位置与最后一个位置进行比较,这将成为可用于执行操作的“增量值”。

例如,如果我触摸屏幕中心,我的触摸位置是 0,0(或者您设置的锚点)。如果我向右移动手指,那么我现在位于 25, 0...这会创建 +25x 的“增量值”。

有了这个 delta 值,您可以执行各种操作,例如moveBy对所有卡...因此,如果我的 deltaX 为 +25,那么我需要将所有卡节点向右移动(您将移动一定的量)根据您的喜好确定)。如果我的 deltaX 为 -25,我会将卡片向左移动一定的量。

实际移动的位置取决于你——你可以放入一个函数update(),或者touchesMoved()以该 deltaX 值的特定速率不断地将卡片向特定方向移动。

好吧,那是一口......也许这会有所帮助:

for touch in touches {
   myGlobalDeltaX = myDeltaXFunc(currentTouch: touch)
   myMoveFunc(cards: allTheCards, byDeltaX: myGlobalDeltaX)
Run Code Online (Sandbox Code Playgroud)

- 你可以搜索如何创建 Delta 函数,但这实际上与代数中的函数是一样的。
-myMoveFunc可以像迭代所有卡节点然后.moveBy同时在它们上运行一样简单。


中检测:

要检测哪张卡位于中心,您可以输入touchesEnded()update()调用来检查屏幕中心节点的名称/身份......所以类似

// `self` here refers to your GameScene class' instance, which is just an `SKScene` object
let centerX = self.frame.midX
let centerY = self.frame.midY
let center = CGPoint(x: centerX, y: centerY)

let centerNode = self.nodes(at: center)
Run Code Online (Sandbox Code Playgroud)

您显然希望将 centerX 和 centerY 更改为您想要中间卡所在的位置:) 现在,它位于屏幕的正中心。

一旦你有了一个centerNode,你就只需要执行你创建的任何函数来“选择”它。

let selectedCard = centerNode
mySelectionFunc(middleCard: selectedCard)
Run Code Online (Sandbox Code Playgroud)

这可能看起来很多,但我绘制了一些步骤,以便更容易理解它。如果需要,您可以在一行中完成所有这些操作。

mySelectionFunc(middleCard: self.nodes(at: CGPoint(x: self.frame.x, y: self.frame.y)))
Run Code Online (Sandbox Code Playgroud)

希望这对一些人有帮助!