SKSpriteNode 不适用于随机数数组
SKSpriteNode not working with Random Number Array
我有一个重复生成的 SKSpriteNode。我创建了一个随机数生成器并尝试将 returns 与不同的 Sprite Image 相关联。但是,它不起作用。数字是随机生成的,但即使返回“2”,SKSpriteNode 也会绘制为 "Fire Barrel 1".
class GameScene: SKScene {
var firstObstacle = SKSpriteNode()
var player = SKSpriteNode()
var randomValue = Int()
override func didMove(to view: SKView) {
createPlayer()
let delay = SKAction.wait(forDuration: 3)
let repeatingAction = SKAction.run(repeatingSequence)
let sequence = SKAction.sequence([ delay, repeatingAction ] )
run(SKAction.repeatForever(sequence))
}
func randomSelector() {
let array = [0, 1, 2, 3]
let randomValue = Int(arc4random_uniform(UInt32(array.count)))
print(array[randomValue])
}
func createPlayer() {
player = SKSpriteNode(imageNamed: "Player")
player.setScale(0.4)
player.position = CGPoint(x: -player.size.width, y: 0)
player.zPosition = 1
addChild(player)
}
func createObstacle() {
if randomValue == 2 {
firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 2")
}
else {
firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 1")
}
firstObstacle.position = CGPoint(x: self.frame.width / 2, y: -self.frame.height / 2 + firstObstacle.size.height / 2)
firstObstacle.zPosition = 1
addChild(firstObstacle)
}
func repeatingSequence() {
randomSelector()
createObstacle()
let moveObstacle = SKAction.moveBy(x: -self.frame.width - firstObstacle.size.width, y: 0, duration: 5)
firstObstacle.run(moveObstacle)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
override func update(_ currentTime: TimeInterval) {
}
}
你的问题是
let randomValue = Int(arc4random_uniform(UInt32(array.count)))
你在做所谓的"variable shadowing"。 randomValue 也存在于 class 实例级别,但在这里因为你使用 let
你已经声明了一个局部范围的版本。
self.value
的实际值是 Int()
也就是 0。因此为什么它是 "First Barrel l"。
您使用的通用设计不是很好。除非你有一些真正的理由需要保存 randomValue
,否则你不应该将它设为 class 实例变量。而是通过参数传递它。
这看起来像:
func randomSelector() -> Int {
let array = [0, 1, 2, 3]
return Int(arc4random_uniform(UInt32(array.count)))
}
func createObstacle(type:Int) {
if (type == 2) {
// Type 2 stuff
} else {
// Other stuff
}
// Rest of your stuff
}
createObstacle(type: randomSelector())
尽管鉴于其工作原理,您甚至不需要参数,您可以这样做:
func createObstacle() {
if (randomSelector() == 2) {
// Type 2 stuff
} else {
// Other stuff
}
// Rest of your stuff
}
我有一个重复生成的 SKSpriteNode。我创建了一个随机数生成器并尝试将 returns 与不同的 Sprite Image 相关联。但是,它不起作用。数字是随机生成的,但即使返回“2”,SKSpriteNode 也会绘制为 "Fire Barrel 1".
class GameScene: SKScene {
var firstObstacle = SKSpriteNode()
var player = SKSpriteNode()
var randomValue = Int()
override func didMove(to view: SKView) {
createPlayer()
let delay = SKAction.wait(forDuration: 3)
let repeatingAction = SKAction.run(repeatingSequence)
let sequence = SKAction.sequence([ delay, repeatingAction ] )
run(SKAction.repeatForever(sequence))
}
func randomSelector() {
let array = [0, 1, 2, 3]
let randomValue = Int(arc4random_uniform(UInt32(array.count)))
print(array[randomValue])
}
func createPlayer() {
player = SKSpriteNode(imageNamed: "Player")
player.setScale(0.4)
player.position = CGPoint(x: -player.size.width, y: 0)
player.zPosition = 1
addChild(player)
}
func createObstacle() {
if randomValue == 2 {
firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 2")
}
else {
firstObstacle = SKSpriteNode(imageNamed: "Fire Barrel 1")
}
firstObstacle.position = CGPoint(x: self.frame.width / 2, y: -self.frame.height / 2 + firstObstacle.size.height / 2)
firstObstacle.zPosition = 1
addChild(firstObstacle)
}
func repeatingSequence() {
randomSelector()
createObstacle()
let moveObstacle = SKAction.moveBy(x: -self.frame.width - firstObstacle.size.width, y: 0, duration: 5)
firstObstacle.run(moveObstacle)
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
}
override func update(_ currentTime: TimeInterval) {
}
}
你的问题是
let randomValue = Int(arc4random_uniform(UInt32(array.count)))
你在做所谓的"variable shadowing"。 randomValue 也存在于 class 实例级别,但在这里因为你使用 let
你已经声明了一个局部范围的版本。
self.value
的实际值是 Int()
也就是 0。因此为什么它是 "First Barrel l"。
您使用的通用设计不是很好。除非你有一些真正的理由需要保存 randomValue
,否则你不应该将它设为 class 实例变量。而是通过参数传递它。
这看起来像:
func randomSelector() -> Int {
let array = [0, 1, 2, 3]
return Int(arc4random_uniform(UInt32(array.count)))
}
func createObstacle(type:Int) {
if (type == 2) {
// Type 2 stuff
} else {
// Other stuff
}
// Rest of your stuff
}
createObstacle(type: randomSelector())
尽管鉴于其工作原理,您甚至不需要参数,您可以这样做:
func createObstacle() {
if (randomSelector() == 2) {
// Type 2 stuff
} else {
// Other stuff
}
// Rest of your stuff
}