2016-01-18 4 views
0

Я пытаюсь создать игру «Space Invaders» быстро, когда пользователь прикасается к экрану, пуля снимается с корабля, но когда я пытаюсь коснуться ее снова, пока пуля движется через экран у меня есть NSException, и игра прерывается. Как настроить действие так, чтобы могло быть несколько экземпляров действия, чтобы стрелок был полуавтоматическим. Ниже мой текущий контроллер сцены.Разрешить несколько экземпляров SKAction

import SpriteKit 

class GameScene: SKScene { 
    let background = SKSpriteNode(imageNamed: "background") 
    let heroShip = SKSpriteNode(imageNamed: "heroShip") 
    let bullet = SKSpriteNode(imageNamed: "bullet") 

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 
    background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame)) 
    heroShip.position = CGPointMake(self.size.width/6.0, self.size.height/2.0) 
    self.heroShip.zPosition = 1.0 
    self.addChild(background) 
    self.addChild(heroShip) 

} 

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    bullet.position = CGPointMake(heroShip.position.x + bullet.size.width/2, heroShip.position.y) 
    let action = SKAction.moveToX(self.frame.width + self.bullet.size.width, duration: 0.5) 
    self.addChild(bullet) 
    bullet.runAction(action, completion: { 
     self.bullet.removeAllActions() 
     self.bullet.removeFromParent() 
    }) 
} 


override func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
} 
+0

Если вы касаетесь когда пуля движется, вам нужно создать еще одну пулю? –

+0

, так что вы хотите иметь несколько пуль, выстреливших с одного корабля? –

ответ

2

Если вы хотите, чтобы несколько выстрелов были удалены с одного корабля, вам необходимо создать несколько экземпляров пули. Теперь у вас есть bullet property of GameScene класс, который является ошибкой. Вы, вероятно, хотите создать экземпляр пули динамически в вашем IBAction

Так попробовать что-то вроде этого:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    let bullet = SKSpriteNode(imageNamed: "bullet") 
    bullet.position = CGPointMake(heroShip.position.x + bullet.size.width/2, heroShip.position.y) 
    let action = SKAction.moveToX(self.frame.width + bullet.size.width, duration: 0.5) 
    self.addChild(bullet) 
    bullet.runAction(action, completion: { 
     bullet.removeAllActions() 
     bullet.removeFromParent() 
    }) 
} 

и удалить

let bullet = SKSpriteNode(imageNamed: "bullet") 

из верхней части класса

+0

Правильный ответ, у вас есть мой upvote;) –

+0

Да, это правильно, я понял, что после того, как я разместил это, никогда не было нового пулевого узла. Спасибо за вашу помощь! –

+0

@appzYourLife О, спасибо :) –

Смежные вопросы