随机化节点移动持续时间
Randomizing node movement duration
我正在用 SpriteKit 制作游戏,我有一个节点在屏幕上来回移动并重复使用代码:
let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: 1.5)
let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: 1.5)
let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))
let moveBackAndForth = SKAction.repeatActionForever(SKAction.sequence([texRight, moveRight, texLeft, moveLeft,]))
Drake1.runAction(moveBackAndForth)
我想弄清楚我可以使用什么方法来随机化持续时间。每次 moveBackandForth 运行时,我希望它使用不同的持续时间重新运行(在游戏内,而不是在游戏之间)。如果有人可以给我一些示例代码来尝试,我将非常感激。
arc4Random 也可以正常工作,但它不会在游戏内随机化,只会在游戏之间随机化。
当您 运行 像您的示例中那样的操作并使用 arc4Random 之类的东西随机化持续时间参数时,这实际上正在发生:
- 随机持续时间设置并存储在动作中。
- 然后在给定持续时间的序列中重复使用动作。
因为动作按原样重复使用,持续时间参数随时间保持不变并且移动速度不是随机的。
解决这个问题的一种方法(我个人更喜欢)是创建一个 "recursive action",或者更确切地说,创建一个 运行 所需序列的方法并调用它像这样递归:
import SpriteKit
class GameScene: SKScene {
let shape = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 20, height: 20))
override func didMoveToView(view: SKView) {
shape.position = CGPointMake(CGRectGetMidX(self.frame) , CGRectGetMidY(self.frame)+60 )
self.addChild(shape)
move()
}
func randomNumber() ->UInt32{
var time = arc4random_uniform(3) + 1
println(time)
return time
}
func move(){
let recursive = SKAction.sequence([
SKAction.moveByX(frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
SKAction.runBlock({self.move()})])
shape.runAction(recursive, withKey: "move")
}
}
要停止操作,请移除其键 ("move")。
我现在没有可以尝试的项目。
但您可能想试试这个:
let action = [SKAction runBlock:^{
double randTime = 1.5; // do your arc4random here instead of fixed value
let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: randTime)
let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: randTime)
let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))
let sequence = SKAction.sequence([texRight, moveRight, texLeft, moveLeft])
Drake1.runAction(sequence)
}];
let repeatAction = SKAction.repeatActionForever(action)
Drake1.runAction(repeatAction)
如果有帮助请告诉我。
我正在用 SpriteKit 制作游戏,我有一个节点在屏幕上来回移动并重复使用代码:
let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: 1.5)
let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: 1.5)
let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))
let moveBackAndForth = SKAction.repeatActionForever(SKAction.sequence([texRight, moveRight, texLeft, moveLeft,]))
Drake1.runAction(moveBackAndForth)
我想弄清楚我可以使用什么方法来随机化持续时间。每次 moveBackandForth 运行时,我希望它使用不同的持续时间重新运行(在游戏内,而不是在游戏之间)。如果有人可以给我一些示例代码来尝试,我将非常感激。
arc4Random 也可以正常工作,但它不会在游戏内随机化,只会在游戏之间随机化。
当您 运行 像您的示例中那样的操作并使用 arc4Random 之类的东西随机化持续时间参数时,这实际上正在发生:
- 随机持续时间设置并存储在动作中。
- 然后在给定持续时间的序列中重复使用动作。
因为动作按原样重复使用,持续时间参数随时间保持不变并且移动速度不是随机的。
解决这个问题的一种方法(我个人更喜欢)是创建一个 "recursive action",或者更确切地说,创建一个 运行 所需序列的方法并调用它像这样递归:
import SpriteKit
class GameScene: SKScene {
let shape = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 20, height: 20))
override func didMoveToView(view: SKView) {
shape.position = CGPointMake(CGRectGetMidX(self.frame) , CGRectGetMidY(self.frame)+60 )
self.addChild(shape)
move()
}
func randomNumber() ->UInt32{
var time = arc4random_uniform(3) + 1
println(time)
return time
}
func move(){
let recursive = SKAction.sequence([
SKAction.moveByX(frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: NSTimeInterval(randomNumber())),
SKAction.runBlock({self.move()})])
shape.runAction(recursive, withKey: "move")
}
}
要停止操作,请移除其键 ("move")。
我现在没有可以尝试的项目。
但您可能想试试这个:
let action = [SKAction runBlock:^{
double randTime = 1.5; // do your arc4random here instead of fixed value
let moveRight = SKAction.moveByX(frame.size.width/2.8, y: 0, duration: randTime)
let moveLeft = SKAction.moveByX(-frame.size.width/2.8, y: 0, duration: randTime)
let texRight = SKAction.setTexture(SKTexture(imageNamed: "Drake2"))
let texLeft = SKAction.setTexture(SKTexture(imageNamed: "Drake1"))
let sequence = SKAction.sequence([texRight, moveRight, texLeft, moveLeft])
Drake1.runAction(sequence)
}];
let repeatAction = SKAction.repeatActionForever(action)
Drake1.runAction(repeatAction)
如果有帮助请告诉我。