如何永远生成图像?精灵套件



我试图在我的游戏中创建一个躲避球功能,我需要反复生成一个躲避球,我使用的当前代码(如下所示(导致线程 1: 异常:"试图添加已经具有父级的 SKNode:名称:'(空(' 纹理:[ '躲避球5' (500 x 500(] 位置:{-140.00019836425781, -55.124687194824219} 比例:{1.00, 1.00} 大小:{30, 30} 锚点:{0.5, 0.5} 旋转:0.00"。我做错了什么?

class ClassicLevelScene: SKScene { 
// Right Pointing Cannons
var rightPointingCannon: [SKReferenceNode] = []
// Dodgeball 5 Constants
var dodgeball5 = SKSpriteNode(imageNamed: "dodgeball5")
// Dodgeball SKActions
var dodgeballRepeat = SKAction()
let dodgeballMoveLeft = SKAction.moveBy(x: -400, y: 0, duration: 0.5)
let dodgeballMoveRight = SKAction.moveBy(x: 400, y: 0, duration: 0.5)
let dodgeballMoveDone = SKAction.removeFromParent()
let dodgeballWait = SKAction.wait(forDuration: 1)
var dodgeballLeftSequence = SKAction()
var dodgeballRightSequence = SKAction()

override func didMove(to view: SKView) {
// Cannon Setup
for child in self.children {
if child.name == "rightPointingCannon" {
if let child = child as? SKReferenceNode {
rightPointingCannon.append(child)
dodgeball5.position = child.position
run(SKAction.repeatForever(
SKAction.sequence([
SKAction.run(spawnDodgeball),
SKAction.wait(forDuration: 1.0)
])
))
}
}
}

// Dodgeball Right Sequence
dodgeballRightSequence = SKAction.sequence([dodgeballMoveRight, dodgeballMoveDone, dodgeballWait])

}
func spawnDodgeball() {
dodgeball5.zPosition = -1
dodgeball5.size = CGSize(width: 30, height: 30)
addChild(dodgeball5)
dodgeball5.run(dodgeballRightSequence)
}
}

假设单个球和球可以离开屏幕:

我实际上建议不要克隆精灵。 只需重复使用即可。

离开屏幕后,您可以重置它的位置和速度并再次显示它。如果您只需要一个对象,则无需创建大量对象。

一个SKNode一次只能有1个父级。

你需要创建一个新的SKSpriteNode或克隆躲避球5,然后再次添加spawnDodgeball((

您可以使用

addChild(dodgeball5.copy())

而不是

addChild(dodgeball5)

但要确保躲避球5以前没有父母。

您的代码似乎过于复杂。

您需要做的就是复制((球并将其添加到场景中

此外,您的所有 SKActions 都不需要在类级别声明

而且不清楚为什么在只有一个实例化的情况下创建大炮数组

class ClassicLevelScene: SKScene { 
// Dodgeball 5 Constants
var dodgeball5 = SKSpriteNode(imageNamed: "dodgeball5")

override func didMove(to view: SKView) {

setupCannonAndBall()
let dodgeballMoveRight = SKAction.moveBy(x: 400, y: 0, duration: 0.5)
let dodgeballMoveDone = SKAction.removeFromParent()
let dodgeballWait = SKAction.wait(forDuration: 1)
dodgeballRightSequence = SKAction.sequence([dodgeballMoveRight, dodgeballMoveDone, dodgeballWait])
//setup sequences ^ before spawning ball
let spawn = SKAction.run(spawnDodgeball)
let wait = SKAction.wait(forDuration: 1.0)
run(SKAction.repeatForever(SKAction.sequence([spawn, wait])))
}
func setupCannonAndBall() {
if let cannonRef = SKReferenceNode(fileNamed: "rightPointingCannon") {
dodgeball5.position = cannonRef.position
dodgeball5.isHidden = true
dodgeball5.size = CGSize(width: 30, height: 30)
dodgeball5.zPosition = -1
}
}
func spawnDodgeball() {
let dodgeball = dodgeball.copy()
dodgeball.isHidden = false
addChild(dodgeball)
dodgeball.run(dodgeballRightSequence)
}
}

最新更新