ios - SpriteKit 增加移动速度

标签 ios swift sprite-kit skaction

我有一个简单的游戏,两条线从屏幕的顶部移动到底部。这两条线之间有一个固定的空间,球必须穿过该空间,否则游戏就结束了。

我对游戏的基础没有问题,我可以添加两条线,每次都有不同位置的空间,但我也想提高线的移动速度。我尝试使用计时器并增加 SKAction.move 的 TimeInterval,但由于稍后添加的行更快,行之间的水平空间变小,这是我不希望发生的。

这是添加两行并将它们移动到屏幕底部的函数。

func addLines() {

    let lineNodeFirst = SKSpriteNode(color: .red, size: CGSize(width: random(min: 100, max: 400), height: 10.0))
    lineNodeFirst.position = CGPoint(x: -size.width / 2, y: 0 + size.height / 2 + 100)
    lineNodeFirst.anchorPoint = CGPoint.zero

    let actionMove = SKAction.move(to: CGPoint(x: lineNodeFirst.position.x, y: 0 - size.height / 2), duration: TimeInterval(2.3))
    let actionMoveDone = SKAction.removeFromParent()

    lineNodeFirst.run(SKAction.sequence([actionMove, actionMoveDone]))

    let centerPoint = CGPoint(x: lineNodeFirst.size.width / 2 - (lineNodeFirst.size.width * lineNodeFirst.anchorPoint.x), y: lineNodeFirst.size.height / 2 - (lineNodeFirst.size.height * lineNodeFirst.anchorPoint.y))
    lineNodeFirst.physicsBody = SKPhysicsBody(rectangleOf: lineNodeFirst.size, center: centerPoint)

    lineNodeFirst.physicsBody?.isDynamic = true
    lineNodeFirst.physicsBody?.categoryBitMask = 2
    lineNodeFirst.physicsBody?.contactTestBitMask = 1
    lineNodeFirst.physicsBody?.collisionBitMask = 0

    self.addChild(lineNodeFirst)

    let spaceBetweenNodes: CGFloat = 150
    let lineNodeSecondWidth: CGFloat = size.width - lineNodeFirst.size.width - spaceBetweenNodes

    let lineNodeSecond = SKSpriteNode(color: .red, size: CGSize(width: lineNodeSecondWidth, height: 10.0))
    lineNodeSecond.anchorPoint = CGPoint.zero
    let lineNodeSecondX = lineNodeFirst.position.x + lineNodeFirst.size.width + spaceBetweenNodes
    lineNodeSecond.position = CGPoint(x: lineNodeSecondX, y: lineNodeFirst.position.y)

    let actionMoveSecond = SKAction.move(to: CGPoint(x: lineNodeSecond.position.x, y: 0 - size.height / 2), duration: TimeInterval(2.3))

    lineNodeSecond.run(SKAction.sequence([actionMoveSecond, actionMoveDone]))

    let centerPointSecond = CGPoint(x: lineNodeSecond.size.width / 2 - (lineNodeSecond.size.width * lineNodeSecond.anchorPoint.x), y: lineNodeSecond.size.height / 2 - (lineNodeSecond.size.height * lineNodeSecond.anchorPoint.y))
    lineNodeSecond.physicsBody = SKPhysicsBody(rectangleOf: lineNodeSecond.size, center: centerPointSecond)

    lineNodeSecond.physicsBody?.isDynamic = true
    lineNodeSecond.physicsBody?.categoryBitMask = 2
    lineNodeSecond.physicsBody?.contactTestBitMask = 1
    lineNodeSecond.physicsBody?.collisionBitMask = 0

    self.addChild(lineNodeSecond)

}

我分享了一个具有基础知识的应用程序演示。有什么提高线移动速度的建议吗?

Demo Video

最佳答案

我想不出一种在不提高所有线路速度的情况下加快线路速度的方法。如果不提高所有行的速度,您将遇到行间间隙缩小的问题,否则您将不得不横穿屏幕上的所有行并同时重写它们的 Action 。

您可以做的可能相当容易的事情是创建 2 个较大的面板,这些面板从上到下滚动场景,并在滚动到底部的页面时重置,从而创建各种滚动背景。然后将您的酒吧应用于这些面板。您现在将看到条形图在屏幕上向下移动的效果。当您想提高游戏的播放速度时,您只需提高 2 个面板上的速度即可。

在我的演示图像中,我添加了多种颜色只是为了向您展示面板之间的间隔。但是如果这些背景颜色被移除,你甚至不会意识到移动的是面板而不是条形条 ;)

作为额外的好处,您可以将面板创建为一个类,将条形图创建为一个类,然后将条形图分配给面板。当需要将面板重置到顶部时,您只需将条形的 2 个内部开口点调整到新的间隙即可。这样您就不会即时动态地创建这些条。

enter image description here

关于ios - SpriteKit 增加移动速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46195834/

相关文章:

ios - 在更新功能中开始倒计时

swift - 如何将物理体赋予弧线?

ios - 将字体大小设置为整数?

ios - 发现信标的最佳测距方式?

ios - 如何设置 Jenkins 来构建使用 Carthage 的 React Native iOS 应用程序?

ios - @Selector 什么都没发生

ios - iMessage 应用程序 - 将 GIF 显示为 UICollectionViewCell 时内存泄漏?

swift - 如何在spritekit中检测双击

ios - 横向和纵向旋转时iPad uitableview关闭位置

objective-c - TableView reloadData 不调用 cellForRowAtIndexPath