我正在处理的应用程序有多个节点,这些节点会重复添加到游戏中。我一直在做的是使用纹理数组创建新的SKSpriteNodes,一旦添加了节点,我就为该节点分配一个特定的物理体。但我想做的不是拥有一个纹理数组,而是拥有一个预先分配了物理主体的SKSpriteNodes数组。
我相信我已经弄清楚如何做到这一点,我遇到的问题是当我尝试将SKSpriteNode多次添加到场景时。
例如,下面是我一直在玩,有效,但如果我添加另一行addChild(arraySegment_Type1 [0]作为SKSpriteNode),我收到错误,应用程序崩溃。
override func didMoveToView(view: SKView) {
anchorPoint = CGPointMake(0.5, 0.5)
var arraySegment_Type1:[SKSpriteNode] = []
var sprite = SKSpriteNode(imageNamed: "myimage")
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(sprite.size.width, sprite.size.height))
sprite.physicsBody?.dynamic = false
sprite.name = "mysprite"
arraySegment_Type1.append(sprite)
addChild(arraySegment_Type1[0] as SKSpriteNode)
}
有人知道如何从阵列中多次加载SKSpriteNodes吗?
答案 0 :(得分:5)
您的代码目前所执行的操作如下:
您的应用崩溃了,因为您尝试将相同的 SKSpriteNode
实例多次添加到场景中。
以下是您的代码的重新设计版本,它实际上会向场景广告几个精灵,它在技术上有效,但还没有很多意义:
override func didMoveToView(view: SKView) {
// your ARRAY is not an array-segment it is a collection of sprites
var sprites:[SKSpriteNode] = []
let numberOfSprites = 16 // or any other number you'd like
// Creates 16 instances of a sprite an add them to the sprites array
for __ in 0..<numberOfSprites {
var sprite = SKSpriteNode(imageNamed: "myimage")
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
sprite.physicsBody?.dynamic = false
sprite.name = "mysprite" // not sure what your plans are here...
sprites.append(sprite)
}
// picks out each sprite in the sprites array
for sprite in sprites {
addChild(sprite)
}
}
现在正如我所说,这并没有多大意义。因为你可能已经注意到精灵们都出现在彼此之上。 更重要的是,在didMoveToView
中执行此操作意味着通过整个阵列舞蹈没有多大意义,您可以简单地执行以下操作:
override func didMoveToView(view: SKView) {
let numberOfSprites = 16 // or any other number you'd like
for __ in 0..<numberOfSprites {
var sprite = SKSpriteNode(imageNamed: "myimage")
// skipping the physicsBody stuff for now as it is not part of the question
addChild(sprite)
}
}
显然有一个改进,但是所有精灵仍然互相覆盖,didMoveToView
可能不是处理这一切的最佳地点,所以也许这样的事情来说明这一点:
override func didMoveToView(view: SKView) {
let sprites = spritesCollection(count: 16)
for sprite in sprites {
addChild(sprite)
}
}
private func spritesCollection(#count: Int) -> [SKSpriteNode] {
var sprites = [SKSpriteNode]()
for __ in 0..<count {
var sprite = SKSpriteNode(imageNamed: "myimage")
// skipping the physicsBody stuff for now as it is not part of the question
// giving the sprites a random position
let x = CGFloat(arc4random() % UInt32(size.width))
let y = CGFloat(arc4random() % UInt32(size.height))
sprite.position = CGPointMake(x, y)
sprites.append(sprite)
}
return sprites
}
现在,因为这仍然只是一个工作且更明智的代码结构的起点......