SpriteKit提高了移动动作的速度

时间:2017-09-13 11:03:31

标签: 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

1 个答案:

答案 0 :(得分:2)

我想不出一种在不增加所有线路速度的情况下加速线路的方法。如果没有增加所有线路的速度,你就会遇到线路间隙缩小的问题,否则你将不得不横穿屏幕上的所有线路并同时重新写入它们的动作。

你可以做的可能相当容易的是创建2个更大的面板,从上到下滚动你的场景,并在底部滚动页面时重置,创建一个滚动的背景。然后将条形应用于这些面板。你现在将具有向下移动屏幕的条形图的效果。当你想要提高游戏的速度时,你所要做的就是提高2个面板的速度。

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

作为额外的奖励,您可以将面板创建为类,将条形图创建为类,并将条形图指定给面板。当需要将面板重置到顶部时,您可以将杆的2个内部开口点调整到新的间隙。这样你就不会动态地动态创建这些条。

enter image description here