У меня есть 6 спрайтов врагов в игре SpriteKit. Я хочу иметь доступ ко всем из них, как к «врагам», чтобы они появлялись на сцене в случайном порядке. Я пытался сделать это:
class GameScene: SKScene {
var redBox = SKSpriteNode(imageNamed: "redBox")
var greenBox = SKSpriteNode(imageNamed: "greenBox")
var blueBox = SKSpriteNode(imageNamed: "blueBox")
var magentaBox = SKSpriteNode(imageNamed: "magentaBox")
var cyanBox = SKSpriteNode(imageNamed: "cyanBox")
var yellowBox = SKSpriteNode(imageNamed: "yellowBox")
func randomBox() -> SKSpriteNode {
let boxes = [redBox, greenBox, blueBox, magentaBox, cyanBox, yellowBox]
let count = boxes.count
var randomOne = Int(arc4random_uniform(UInt32(count)))
var randomBox = boxes[randomOne]
return randomBox
}
var oneBox: SKSpriteNode = randomBox()
}
Но в oneBox Xcode выдает ошибку и говорит: «отсутствует параметр № 1 в вызове».
Как правильно выбрать случайный узел?
РЕДАКТИРОВАТЬ: мой код, вызывающий эту ошибку:
class GameScene: SKScene {
//boxes
var redBox = SKSpriteNode(imageNamed: "redBox")
var greenBox = SKSpriteNode(imageNamed: "greenBox")
var blueBox = SKSpriteNode(imageNamed: "blueBox")
var magentaBox = SKSpriteNode(imageNamed: "magentaBox")
var cyanBox = SKSpriteNode(imageNamed: "cyanBox")
var yellowBox = SKSpriteNode(imageNamed: "yellowBox")
var oneBox:SKSpriteNode!
func randomBox() -> SKSpriteNode {
let boxes = [redBox, greenBox, blueBox, magentaBox, cyanBox, yellowBox]
let count = boxes.count
var randomOne = Int(arc4random_uniform(UInt32(count)))
var randomBox = boxes[randomOne]
return randomBox
}
//random for Y
func random() -> CGFloat {
return CGFloat(Float(arc4random()) / 0xFFFFFFFF)
}
func random(#min: CGFloat, max: CGFloat) -> CGFloat {
return random() * (max - min) + min
}
override func didMoveToView(view: SKView) {
/* Setup your scene here */
var oneBox: SKSpriteNode = randomBox()
func addUpperBoxes() {
let middleY = random(min: size.height/2, max: size.height - size.height/3)
oneBox.position = CGPoint(x: size.width + oneBox.size.width/2, y: middleY)
addChild(oneBox)
let middleDuration = random(min: CGFloat(1.5), max: CGFloat(2.5))
let middleMove = SKAction.moveTo(CGPoint(x: -oneBox.size.width/2, y: middleY), duration: NSTimeInterval(middleDuration))
let middleMoveDone = SKAction.removeFromParent()
oneBox.runAction(SKAction.sequence([middleMove, middleMoveDone]))
}
runAction(SKAction.repeatActionForever(
SKAction.sequence([
SKAction.runBlock(addUpperBoxes),
SKAction.waitForDuration(0.5)
])
))
}
oneBox = ...
в такой метод, какdidMoveToView
илиtouchesBegan
. - person 0x141E   schedule 17.08.2015didMoveToView
, а он мне понадобится вUpdate?
? - person TimurTim   schedule 17.08.2015var yellow...
какvar oneBox:SKSpriteNode!
, а затем инициализируйте вdidMoveToView
. Затем вы можете получить к нему доступ вupdate
. - person 0x141E   schedule 17.08.2015self.addChild(yellowBox); self.addChild(redBox)
и т. д., или будет достаточно добавитьaddChild(oneBox)
? - person TimurTim   schedule 17.08.2015addChild
добавит ящики на сцену, поэтому добавлять их следует только тогда, когда они нужны в игре. Вы можете добавить поле с помощьюoneBox
, но убедитесь, что вы добавили поле только один раз, иначе приложение выйдет из строя. - person 0x141E   schedule 17.08.2015Attemped to add a SKNode which already has a parent: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'cyanBox' (50 x 50)]
, но я не понимаю почему, я сделал толькоaddChild(oneBox)
. - person TimurTim   schedule 17.08.2015SKSpriteNode
в randomBox и назначить узлу случайный цвет. Тогда у вас может быть несколько ящиков в сцене одного цвета. - person 0x141E   schedule 17.08.2015