2017-09-13 110 views
3

我有一个简单的游戏,两条线从屏幕的顶部移动到底部。这两条线之间有一个固定的空间,一个球必须通过该空间,否则游戏结束。SpriteKit增加移动动作的速度

我对游戏的基础知识没有问题,我可以添加两行,每次都有不同位置的空间,但我也想增加行的移动速度。我尝试使用计时器并增加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

+0

如果你想增加动线的速度,而不是通过可见的屏幕上,加速它们的所有的所有行加快只有最后一行,循环。 – Whirlwind

+0

如果您使用'SKCamera',您可以移动球而不是线。 – 0x141E

回答

2

我想不出加快线不上的所有线路增加速度的一种方式。在不增加速度,所有的线,你将拥有的线之间的差距缩小了问题,否则你将不得不通过在屏幕上的所有行横向和在同一时间重新编写他们的行动。

你可以做什么这可能是相当容易的创建2个,通过场景从上到下滚动更大的面板,当滚动出底部的网页,创建各种各样的滚动背景复位。然后将你的酒吧应用到这些面板。你现在将会有这些酒吧在屏幕下移动的效果。当你想提高游戏速度时,你只需要增加2个面板的速度。

在我的演示图片我已经添加了多种颜色只是向你展示面板之间的断裂。但如果这些背景颜色被删除,你甚至不会意识到这是面板移动,而不是酒吧;)

作为一个额外的奖励,你可以创建面板作为一个班级和酒吧作为一个类,并分配酒吧的面板。当谈到时间,面板复位到顶部,你可能只是调整杆的2个内部开口指向一个新的差距。这样你就不会动态地创建这些条。

enter image description here