ScriteKit中的ScrollView

我发现了一些类似于这个的其他问题和答案,但没有一个对我来说非常适合。

我的愿景是在屏幕底部有一个水平的可滚动视图,在这里我可以滚动看起来像手中的牌。 理想情况下,我最终可以将卡放在中间放大一些,并给它一个突出显示的外观,以向用户显示select了哪张卡。 更好的办法是,如果我能弄清楚如何保持滚动视图的大小来减less视图中的精灵数量。

无论如何,我对XCode和Swift还是很新的,所以我很难把我find的东西和改变。 但是,我希望快速学习。

我到目前为止所了解的是,一个UIScrollView可以覆盖现场,并与一个可移动的spritenode我可以滚动视图。 该视图然后将坐标以某种方式转换成SpriteKit场景来移动看起来像在视图中的精灵。 我认为这是如何工作的。 任何帮助将是伟大的。 我很困难。 <3

您必须使用全局/成员variables在touchesMoved()创build自己的逻辑。

不幸的是,很多gamedev和SK是math和逻辑..你必须想出你自己的问题和解决scheme..没有手册,因为在编程和Swift的可能性是无止境的:)


搬牌:

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

例如,如果我触摸屏幕的中心,我的触摸位置是0,0(或任何您的锚点设置)。 如果我将手指向右移动,那么我现在就说25,0 …这会产生+ 25x的“增量值”。

用这个delta值,你可以执行各种动作,比如所有卡片的moveBy …所以如果我有一个+25的deltaX,那么我需要把所有的卡片节点向右移动(一定量的你将根据您的喜好决定)。 如果我有一个-X的deltaX,我将卡向左移动一定的数量。

在哪里做实际的移动是由你决定的 – 你可以在update()touchesMoved()中放入一个函数,它不断地以某个特定的deltaX值的速率移动卡片。

好吧,这是一口…也许这将有助于:

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

– 您可以search如何使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) 

你显然想要把centerX和centerY改成任何你想要的中间牌:)现在,这只是在屏幕的死点。

一旦你有一个中心centerNode ,你只需要做任何你创build的function来“select”它。

 let selectedCard = centerNode mySelectionFunc(middleCard: selectedCard) 

这可能看起来像很多,但我画出了步骤,使理解这一点更容易..你可以做所有这一切在一行,如果需要的话。

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

希望这有助于一些!