ios – SpriteKit中的ScrollView

我发现了一些与此类似的其他问题和答案,但它们都不适合我.

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

无论如何,我仍然是XCode和Swift的新手,所以我很难接受我找到的并改变它.但是,我希望快速学习.

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

最佳答案 您必须使用全局/成员变量在touchesMoved()中创建自己的逻辑.

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

移动卡片:

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

例如,如果我触摸屏幕的中心,我的触摸位置是0,0(或者你的锚点设置为什么).如果我向右移动我的手指,那么我现在说25,0 ……这会产生25倍的“delta值”.

使用该delta值,您可以对所有卡执行各种操作,例如moveBy …所以,如果我的deltaX为25,那么我需要将所有卡节点向右移动(按一定数量,您将根据您的喜好确定).如果我的deltaX为-25,我会将卡片向左移动一定数量.

在你做的地方,实际移动取决于你 – 你可以在update()或touchesMoved()中放置一个函数,它不断地以某个deltaX值的特定速率移动卡片.

好的,这是一口……也许这会有所帮助:

for touch in touches {
   myGlobalDeltaX = myDeltaXFunc(currentTouch: touch)
   myMoveFunc(cards: allTheCards, byDeltaX: myGlobalDeltaX)

– 您可以搜索如何制作Delta函数,但它实际上与Algebra完全相同.
– 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)

您显然希望将centerX和centerY更改为您想要中间卡的位置:)现在,这只是在屏幕的死点.

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

let selectedCard = centerNode
mySelectionFunc(middleCard: selectedCard)

这可能看起来很多,但我已经提出了让它更容易理解的步骤.如果需要,你可以在一行中完成所有这些.

mySelectionFunc(middleCard: self.nodes(at: CGPoint(x: self.frame.x, y: self.frame.y)))

希望这有助于一些!

点赞