我正在开发的应用有多个节点,这些节点被重复添加到游戏中。我一直在做的是使用纹理数组创建新的 SKSpriteNodes,一旦添加了节点,我就会为该节点分配一个特定的物理体。但我想做的不是拥有一组纹理,而是拥有一组预先分配了物理体的 SKSpriteNodes。
我相信我已经想出了如何做到这一点,我遇到的问题是当我尝试多次将 SKSpriteNode 添加到场景中时。
例如,下面是我一直在玩的,它可以工作,但是如果我添加另一行 addChild(arraySegment_Type1[0] as 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 吗?
最佳答案
您的代码目前执行的操作如下:
- 创建一个 [SKSpriteNode] 类型的空数组
- 创建单个 SKSpriteNode 实例
- 为 Sprite 添加一个 physicsBody
- 将这个单个 spriteNode 添加到一个数组中
- 挑选出数组中的第一个对象(索引 0)并将其广告到父节点。
您的应用程序崩溃是因为您试图多次将相同 SKSpriteNode
实例添加到场景中。
这是您的代码的修改版本,它实际上将几个 Sprite 添加到场景中,它在技术上是可行的,但目前还没有多大意义:
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)
}
}
正如我所说,这并没有多大意义。您可能已经注意到,为了一件事,所有 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)
}
}
显然是一个改进,但是所有的 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
}
现在,虽然这是一个长期的伤口,但它仍然只是通向一个有效且更明智的代码结构的起点......
关于arrays - 从数组中多次使用 SKSpriteNode(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32401936/