从数组中多次使用 SKSpriteNode(s)
Posted
技术标签:
【中文标题】从数组中多次使用 SKSpriteNode(s)【英文标题】:Use SKSpriteNode(s) Multiple Times From An Array 【发布时间】:2015-09-04 15:44:14 【问题描述】:我正在开发的应用程序有多个节点,这些节点会重复添加到游戏中。我一直在做的是使用纹理数组创建新的 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 多次加载到场景中? 【参考方案1】:您的代码目前的作用如下:
创建一个 [SKSpriteNode] 类型的空数组 创建单个 SKSpriteNode 实例 向精灵添加一个physicsBody 将此单个 spriteNode 添加到数组中 挑选出数组中的第一个对象(索引 0)并将其添加到 parentNode。您的应用程序崩溃,因为您尝试将 same 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
现在,尽管它是长期伤痕累累的,但它仍然只是迈向有效且更明智的代码结构的起点......
【讨论】:
我正在使用横向模式,我添加了 10 个精灵,其中有几个是不可见的。你能告诉我如何在屏幕内定位每个精灵吗?actually ads several sprites
- "adds" 拼写错误以上是关于从数组中多次使用 SKSpriteNode(s)的主要内容,如果未能解决你的问题,请参考以下文章
从 SKSpriteNode 类实例访问 GameScene 中的数组?
如何在Swift中正确地从父节点中删除SKSpriteNode的子类(要从数组中移除,屏幕上的空格......)?
如何从数组中抓取一个随机元素而不多次抓取同一个元素? [复制]