第一次编码,我想我将从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)


希望这对您有帮助,祝您好运:)

10-05 21:00