第一次编码,我想我将从Spritekit(Swift 3)的游戏开始。我遇到了一个问题,当我向场景添加精灵节点时,它会复制它。我还应该提到我是作为重复发生的功能来执行此操作的,其中我随机创建了四个障碍之一。
我设置了一种计时机制来使func定期运行。然后,该func会从0-3生成一个随机数,然后使用switch / case方法,该方法只能创建四个选项中的一个,但它始终会创建2(仍是随机的,因此可能有2个重复项或2个单独的选项重叠)。我也尝试过“ if,else if ...”语句,结果相同。
我已经在没有计时器和没有随机数生成的情况下对此进行了测试,它们都不是导致我相信其“选择”(切换或if)方法的问题,或者我使用的是addChild错误。
关于该问题可能是什么的想法,还是随机生成子画面的替代解决方案?
提前致谢!
这段代码还有很多,但我已经将其简化为熊的要点,但我仍然得到了重复。
let movementAmount = arc4random() % UInt32(self.frame.height / 2)
let wallOffset = CGFloat(movementAmount) - self.frame.height / 4
let xCoordinate = self.frame.midX
let yCoordinate = self.frame.midY + (self.frame.height / 2) + wallOffset
wallTop1 = SKSpriteNode(texture: wallTop1Tex)
wallTop1.scale(to: CGSize(width: wallTop1Tex.size().width / 2, height: wallTop1Tex.size().height / 2))
wallTop1.position = CGPoint(x: xCoordinate, y: yCoordinate)
wallTop1.zPosition = objectZPos
addChild(wallTop1)
更新:我已经进行了更多的测试,结果表明,至少根据节点数,即使不涉及随机性,每次addChild函数都将创建两个节点。含义此代码
let xCoordinate = self.frame.midX
let yCoordinate = self.frame.midY
objectTex = SKSpriteTexture(imageNamed: "object")
object = SKSpriteNode(texture: objectTex)
object.position = CGPoint(x: xCoordinate, y: yCoordinate)
self.addChild(object)
在我的Sprite Kit版本中创建了两个节点,除非我有一些未知的设置错误,否则我只能假定这是一个小故障?如果是这样,我很想听听那是什么,如果没有,则可以运行某种类型的去毛刺/调试功能,以解决似乎与SpriteKit本身有关的问题?
最佳答案
上面的代码看起来不错,找到一个起始位置,然后添加一个新的子节点,据我所知那里没有问题。
现在...您说:
除了它总是创建2
那么,上面的代码会添加两个childNodes吗?...不应该:)
也许,现在我正在猜测,您的问题是,此代码多次运行?请记住,每次调用addChild()
时,它都会添加一个新的子节点,而不管是否已有childNode。
因此,可能是您多次调用以上代码,并在现有子节点之上添加了一个新的childNode。
删除子节点
如果是这样,并且如果您打算只有一个childNode,则可以在再次添加wallTop1
之前从其父级中删除SKNode
(我知道,从父级中删除子级,有时编程很残酷;)。 removeFromParent()
具有可以使用的方法removeAllChildren()
,因此您可以执行以下操作:
...
if wallTop1 != nil && wallTop1.parent != nil {
wallTop1.removeFromParent()
}
//And then your "add new node code"
wallTop1 = SKSpriteNode(texture: wallTop1Tex)
wallTop1.scale(to: CGSize(width: wallTop1Tex.size().width / 2, height:wallTop1Tex.size().height / 2))
wallTop1.position = CGPoint(x: xCoordinate, y: yCoordinate)
...
或者...如果根本不需要任何childNode,可以使用
wallTop1
,因此...类似:removeAllChildren()
//And then your "add new node code"
wallTop1 = SKSpriteNode(texture: wallTop1Tex)
wallTop1.scale(to: CGSize(width: wallTop1Tex.size().width / 2, height:wallTop1Tex.size().height / 2))
wallTop1.position = CGPoint(x: xCoordinate, y: yCoordinate)
...
或者,您可以给
name
一个filter
,然后通过childNodes
给并再次找到该节点:let childNodeName = "somethingCleverHere"
let existingChildren = children.filter { $0.name == childNodeName}
if existingChildren.count > 0 {
removeChildrenIn(existingChildren!)
}
//And then your "add new node code"
wallTop1 = SKSpriteNode(texture: wallTop1Tex)
wallTop1.scale(to: CGSize(width: wallTop1Tex.size().width / 2, height:wallTop1Tex.size().height / 2))
wallTop1.position = CGPoint(x: xCoordinate, y: yCoordinate)
wallTop1.zPosition = objectZPos
//Remember to give it a name
wallTop1.name = childNodeName
addChild(wallTop1)
希望这对您有帮助,祝您好运:)