SpriteKit 增加移动速度
SpriteKit increasing speed of move action
我有一个简单的游戏,两条线从屏幕的顶部移动到底部。在这两条线之间有一个固定的 space 并且球必须通过 space 否则游戏就结束了。
我对游戏的基础没有问题,我可以添加两条线,一条space每次都有不同的位置,但我也想提高线的移动速度。我尝试使用计时器并增加 SKAction.move 的 TimeInterval,但由于稍后添加的行更快,行之间的水平 space 变小,这是我不想发生的。
这是添加两行并将它们移动到屏幕底部的函数。
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)
}
我分享了一个具有基础知识的应用程序演示。有什么提高线移动速度的建议吗?
我想不出在不提高所有线路速度的情况下加快线路速度的方法。如果不提高所有行的速度,您将遇到行与行之间间隙缩小的问题,否则您将不得不横穿屏幕上的所有行并同时重写它们的动作。
您可以做的可能相当容易的事情是创建 2 个更大的面板,这些面板从上到下滚动场景,并在滚动到底部的页面时重置,从而创建各种滚动背景。然后将您的酒吧应用于这些面板。您现在将看到条形图在屏幕上向下移动的效果。当您想提高游戏的播放速度时,您只需提高 2 个面板上的速度即可。
在我的演示图像中,我添加了多种颜色只是为了向您展示面板之间的间隔。但是如果这些背景颜色被移除,你甚至不会意识到移动的是面板而不是条形图 ;)
作为额外的好处,您可以将面板创建为 class,将条形图创建为 class,并将条形图分配给面板。当需要将面板重置到顶部时,您只需将条形的 2 个内部开口点调整到新的间隙即可。这样您就不会动态创建这些条形。
我有一个简单的游戏,两条线从屏幕的顶部移动到底部。在这两条线之间有一个固定的 space 并且球必须通过 space 否则游戏就结束了。
我对游戏的基础没有问题,我可以添加两条线,一条space每次都有不同的位置,但我也想提高线的移动速度。我尝试使用计时器并增加 SKAction.move 的 TimeInterval,但由于稍后添加的行更快,行之间的水平 space 变小,这是我不想发生的。
这是添加两行并将它们移动到屏幕底部的函数。
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)
}
我分享了一个具有基础知识的应用程序演示。有什么提高线移动速度的建议吗?
我想不出在不提高所有线路速度的情况下加快线路速度的方法。如果不提高所有行的速度,您将遇到行与行之间间隙缩小的问题,否则您将不得不横穿屏幕上的所有行并同时重写它们的动作。
您可以做的可能相当容易的事情是创建 2 个更大的面板,这些面板从上到下滚动场景,并在滚动到底部的页面时重置,从而创建各种滚动背景。然后将您的酒吧应用于这些面板。您现在将看到条形图在屏幕上向下移动的效果。当您想提高游戏的播放速度时,您只需提高 2 个面板上的速度即可。
在我的演示图像中,我添加了多种颜色只是为了向您展示面板之间的间隔。但是如果这些背景颜色被移除,你甚至不会意识到移动的是面板而不是条形图 ;)
作为额外的好处,您可以将面板创建为 class,将条形图创建为 class,并将条形图分配给面板。当需要将面板重置到顶部时,您只需将条形的 2 个内部开口点调整到新的间隙即可。这样您就不会动态创建这些条形。