首页 > 解决方案 > Swift SpriteKit,不能多次发射子弹

问题描述

我正在制作一个小游戏,其中有一艘宇宙飞船,你可以发射子弹,当我运行程序并单击发射子弹时,它可以工作,但是当我再次单击时它不会发射。它给了我

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),程序就会崩溃。反正有没有等到前一颗子弹被删除就再射一颗子弹?

标签: swiftsprite-kitswift4

解决方案


您只需要在fireBullet方法中初始化您的 Bullet 精灵。

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)
  }

推荐阅读