Xcode SKSpriteNode不能有多个孩子
我正试图拥有多个相同类型/父节点的精灵节点,但当我尝试生成另一个节点时,会出现错误。”NSInvalidArgumentException',原因:'试图添加已具有父级的SKNode' 这是我的密码:Xcode SKSpriteNode不能有多个孩子,xcode,swift,skspritenode,Xcode,Swift,Skspritenode,我正试图拥有多个相同类型/父节点的精灵节点,但当我尝试生成另一个节点时,会出现错误。”NSInvalidArgumentException',原因:'试图添加已具有父级的SKNode' 这是我的密码: import SpriteKit class GameScene: SKScene { //global declarations let player = SKSpriteNode(imageNamed: "mage") let fireball = SKSpriteN
import SpriteKit
class GameScene: SKScene {
//global declarations
let player = SKSpriteNode(imageNamed: "mage")
let fireball = SKSpriteNode(imageNamed: "fireball")
override func didMoveToView(view: SKView) {
/* Setup your scene here */
createScene()
}
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch in (touches as! Set<UITouch>) {
let location = touch.locationInNode(self)
spawnFireball(location)
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
self.enumerateChildNodesWithName("fireball", usingBlock: ({
(node,error) in
if (self.fireball.position.x < -self.fireball.size.width/2.0 || self.fireball.position.x > self.size.width+self.fireball.size.width/2.0
|| self.fireball.position.y < -self.fireball.size.height/2.0 || self.fireball.position.y > self.size.height+self.fireball.size.height/2.0) {
self.fireball.removeFromParent()
self.fireball.removeAllChildren()
self.fireball.removeAllActions()
}
}))
}
func createScene() {
//player
player.size = CGSizeMake(100, 100)
player.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2 + 50)
player.zPosition = 2.0
self.addChild(player)
}
func spawnFireball(point: CGPoint) {
//setup
fireball.name = "fireball"
fireball.size = CGSizeMake(100, 50)
let fireballCenter = CGPointMake(fireball.size.width / 4 * 3, fireball.size.height / 2)
fireball.position = player.position
fireball.physicsBody = SKPhysicsBody(circleOfRadius: fireball.size.height/2, center: fireballCenter)
fireball.physicsBody?.affectedByGravity = false
//action
var dx = CGFloat(point.x - player.position.x)
var dy = CGFloat(point.y - player.position.y)
let magnitude = sqrt(dx * dx + dy * dy)
dx /= magnitude
dy /= magnitude
let vector = CGVector(dx: 32.0 * dx, dy: 32.0 * dy)
var rad = atan2(dy,dx)
fireball.runAction(SKAction.rotateToAngle(rad, duration: 0.0))
self.addChild(fireball)
fireball.physicsBody?.applyImpulse(vector)
}
}
导入SpriteKit
类游戏场景:SKScene{
//全球宣言
让玩家=SKSpriteNode(图像名为:“法师”)
让fireball=SKSpriteNode(图像名为:“fireball”)
覆盖func didMoveToView(视图:SKView){
/*在这里设置场景*/
createScene()
}
覆盖func touchesBegined(触摸:设置,withEvent事件:UIEvent){
/*当触摸开始时调用*/
用于触摸输入(触摸设置为){
let location=touch.locationInNode(自)
火球(位置)
}
}
覆盖函数更新(currentTime:CFTimeInterval){
/*在渲染每个帧之前调用*/
self.枚举名为(“fireball”)的子节点,使用block:({
(节点,错误)在
如果(self.fireball.position.x<-self.fireball.size.width/2.0 | | self.fireball.position.x>self.size.width+self.fireball.size.width/2.0
||self.fireball.position.y<-self.fireball.size.height/2.0 | | self.fireball.position.y>self.size.height+self.fireball.size.height/2.0){
self.fireball.removeFromParent()
self.fireball.removeAllChildren()
self.fireball.removeAllActions()
}
}))
}
func createScene(){
//玩家
player.size=CGSizeMake(100100)
player.position=CGPointMake(self.frame.size.width/2,self.frame.size.height/2+50)
player.zPosition=2.0
self.addChild(播放器)
}
func生成火球(点:CGPoint){
//设置
fireball.name=“fireball”
fireball.size=CGSizeMake(100,50)
让fireballCenter=CGPointMake(fireball.size.width/4*3,fireball.size.height/2)
fireball.position=player.position
fireball.physicsBody=SKPhysicsBody(圆环半径:fireball.size.height/2,中心:fireball中心)
火球。物理体?。受重力影响=假
//行动
var dx=CGFloat(point.x-player.position.x)
var dy=CGFloat(point.y-player.position.y)
设幅值=sqrt(dx*dx+dy*dy)
dx/=震级
dy/=震级
设向量=CGVector(dx:32.0*dx,dy:32.0*dy)
var rad=atan2(dy,dx)
火球。奔跑动作(SKAction。旋转角度(弧度,持续时间:0.0))
self.addChild(火球)
火球。物理体?。应用脉冲(矢量)
}
}
您需要实例化另一个SKSpriteNode
。在现有代码中,创建单个火球并将其添加到场景中;当您再次尝试添加相同的火球时,程序崩溃
首先,删除let fireball=SKSpriteNode…
行。将其移动到spawnFireball()
方法内部,如下所示:
func spawnFireball(point: CGPoint) {
let fireball = SKSpriteNode(imageNamed: "fireball")
//Insert all customization here (your existing code should mostly work)
self.addChild(fireball)
}
因为fireball
变量是一个局部变量,所以现在每次调用函数时都可以实例化一个新变量。现在,只需将update()
方法更改为正确使用enumerateChildrenWithName()
,方法是将everyself.fireball
更改为justnode
这样,代码将循环遍历当前在场景中的每个现有火球,而不是当前代码,因为当前代码只允许您创建一个火球