我发现了其他一些与此类似的问题和答案,但没有一个非常适合我。
我的愿景是在屏幕底部有一个水平可 ScrollView ,我可以在其中滚动浏览看起来像手中卡片的内容。理想情况下,我最终可以将中间的卡片放大一点,并突出显示它以向用户显示选择了哪张卡片。如果我能弄清楚如何调整 ScrollView 的大小以适应 View 中 Sprite (卡片)的数量,那就更好了。
无论如何,我对 XCode 和 Swift 还是很陌生,所以我很难接受我发现的东西并改变它。但是,我希望学得快。
到目前为止,我所了解的是 UIScrollView 可以覆盖场景,并且使用可移动的 spritenode 我可以滚动浏览 View 。然后 View 会以某种方式将坐标转换为 SpriteKit 场景,以移动看起来就像在 View 中的 Sprite 。我认为这就是它的工作原理。任何帮助都会很棒。我很困。 <3
最佳答案
您必须使用全局/成员变量在 touchesMoved()
中创建您自己的逻辑。
不幸的是,很多 gamedev 和 SK 都是数学和逻辑。你必须想出自己的问题和解决方案。没有手册,因为编程和 Swift 的可能性是无穷无尽的:)
移动卡片:
基本上,您将每个触摸
位置与最后一个位置进行比较,这将成为您可以用来执行操作的“增量值”。
例如,如果我触摸屏幕中央,我的触摸位置是 0,0(或者你的定位点设置的任何位置)。如果我向右移动手指,那么我现在位于 25、0 处……这将创建一个 +25 倍的“增量值”。
有了这个 delta 值,您可以对所有卡片执行各种操作,例如 moveBy
...所以如果我的 deltaX 为 +25,那么我需要移动所有卡片节点向右(您将根据自己的喜好确定一定数量)。如果我的 deltaX 为 -25,我会将牌向左移动一定量。
实际移动的位置由您决定——您可以在 update()
或 touchesMoved()
中放置一个函数,不断将卡片朝某个方向移动以该 deltaX 值的特定速率..
好吧,那是一口...也许这会有所帮助:
for touch in touches {
myGlobalDeltaX = myDeltaXFunc(currentTouch: touch)
myMoveFunc(cards: allTheCards, byDeltaX: myGlobalDeltaX)
- 您可以搜索如何制作 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
,你就只需要执行你创建的任何函数来“选择”它。
let selectedCard = centerNode
mySelectionFunc(middleCard: selectedCard)
这可能看起来很多,但我列出了一些步骤以使其更容易理解。如果需要,您可以在一行中完成所有这些操作。
mySelectionFunc(middleCard: self.nodes(at: CGPoint(x: self.frame.x, y: self.frame.y)))
希望这对一些人有帮助!
关于ios - SpriteKit 中的 ScrollView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498345/