Swift SpriteKit, не может стрелять больше одного раза - PullRequest
0 голосов
/ 10 июня 2018

Я делаю небольшую игру, в которой есть космический корабль, и вы можете запустить пулю, когда я запускаю программу и нажимаю, чтобы запустить пулю, она работает, однако, когда я нажимаю снова, она не срабатывает.Это дает мне

Thread 1: signal SIGABRT

, когда я пытаюсь выстрелить во второй раз.Может ли кто-нибудь помочь мне?

Вот код:

import SpriteKit
import GameplayKit
import UIKit

class GameScene: SKScene {

let player = SKSpriteNode(imageNamed: "mySpaceship")
//let stars = SKSpriteNode(imageNamed: "stars")
let bullet = SKSpriteNode(imageNamed: "bullet")

override func didMove(to view: SKView) {
    //print(frame.size.width)
    //print(frame.size.height)

    /*stars.position = CGPoint(x: self.size.width/2, y:self.size.height/2)
    addChild(stars)*/
    player.position = CGPoint(x:0, y:0)
    player.zPosition = 2
    self.addChild(player)


}

func fireBullet() {
    bullet.position = player.position
    bullet.zPosition = 1
    self.addChild(bullet)

    let moveBullet = SKAction.moveTo(y: self.size.height + bullet.size.height, duration: 1)
    let deleteBullet = SKAction.removeFromParent()
    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet.run(bulletSequence)


}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print("Fired bullet")
    fireBullet()
}

override func update(_ currentTime: TimeInterval) {
}


}

Весь этот код находится в моем файле GameScene.swift.Спасибо!

ОБНОВЛЕНИЕ: Посмотрев на счетчик узлов, я заметил, что если я запустил пулю после того, как предыдущая пуля была удалена (общее количество узлов равно 2), пуля будет стрелять нормально.Однако если я выстрелю пулю до того, как предыдущая пуля была удалена (что делает число узлов 2), программа вылетит.Есть ли способ выстрелить еще одну пулю, не дожидаясь удаления предыдущей пули?

1 Ответ

0 голосов
/ 10 июня 2018

Вам просто нужно инициализировать свой Bullet-спрайт в методе fireBullet .

func fireBullet() {
    // make sure you initialize bullet here.
    let bullet = SKSpriteNode(imageNamed: "bullet")
    bullet.position = player.position
    bullet.zPosition = 1
    self.addChild(bullet)

    let moveBullet = SKAction.moveTo(y: self.size.height +   bullet.size.height, duration: 1)
    let deleteBullet = SKAction.removeFromParent()
    let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
    bullet.run(bulletSequence)
  }
...