在 spawn 函数之外声明 SKSpriteNode 会在 Swift 中返回 SIGABRT



我正在制作一款游戏,其中我有一个玩家和无限数量的敌人,这些敌人在一定时间内在给定位置生成。这些敌人正在向玩家发射子弹。我需要能够在 SpawnEnemies() 函数之外访问 Enemy 变量,以便我可以在我的 SpawnBullets() 函数中使用它。我尝试在 SpawnEnemies() 函数外部声明 Enemy 变量,但它返回了 Sigabrt,我不知道如何在函数外部访问 Enemy 变量而不会收到此错误。

敌人声明:

var Enemy = SKSpriteNode(imageNamed: "Enemy.png")

生成敌人功能:

func SpawnEnemies() {
     let MinValue = self.size.width/8
     let MaxValue = self.size.width-20
     let SpawnPoint =  UInt32(MaxValue-MinValue)
     self.Enemy.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height)
     let action = SKAction.moveToY(-70, duration: 3.0)
     self.Enemy.runAction(SKAction.repeatActionForever(action))
     self.addChild(Enemy)
}

生成子弹功能:

func SpawnBullets(){
     let Bullet = SKSpriteNode(imageNamed: "bullet.png")
     Bullet.zPosition = -5
     Bullet.position = CGPointMake(Enemy.position.x, Enemy.position.y)
     let action = SKAction.moveToY(self.size.height + 30, duration: 1.0)
     Bullet.runAction(SKAction.repeatActionForever(action))
     self.addChild(Bullet)
}

在didMoveToView()中调用SpawnEnemies函数:

var EnemyTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("SpawnEnemies"),userInfo: nil, repeats: true)

在didMoveToView()中调用SpawnBullets函数:

var BulletTimer = NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: Selector("SpawnBullets"),userInfo: nil, repeats: true)

我收到此错误,这是一个 sigabrt,但我使用断点来确定错误的确切位置和错误是什么:

尝试

添加已经具有父级的 SKNode: 名称:'(空)' 纹理:[ '敌人.png' (60 x 80)] 位置:{132, 1024} 比例:{1.00, 1.00} 大小:{60, 80} 锚点:{0.5, 0.5} 旋转:0.00

将孩子添加到场景中已经是"无限的",您只需要利用它来发挥自己的优势。

首先像这样重做你的子弹功能,这样你就在敌人中通过。

func SpawnBullets(enemy : SKSpriteNode){
     let Bullet = SKSpriteNode(imageNamed: "bullet.png")
     Bullet.zPosition = -5
     Bullet.position = CGPointMake(enemy.position.x, enemy.position.y)
     let action = SKAction.moveToY(-self.size.height - 70, duration: 1.0)
     Bullet.runAction(SKAction.repeatActionForever(action))
     self.addChild(Bullet) 
}

然后重做你的敌人功能,这样你加班就叫它,你生成一个新的敌人。

func SpawnEnemies() {
     var Enemy = SKSpriteNode(imageNamed: "Enemy.png")
     Enemy.name =  "enemy";
     let MinValue = self.size.width/8
     let MaxValue = self.size.width-20
     let SpawnPoint =  UInt32(MaxValue-MinValue)
     Enemy.position = CGPoint(x: CGFloat(arc4random_uniform(SpawnPoint)), y: self.size.height)
     let action = SKAction.moveToY(-70, duration: 3.0)
     Enemy.runAction(SKAction.repeatActionForever(action))
     self.addChild(Enemy)
}

在函数didMoveToView中,让我们向处理我们的计时的场景添加动作,这样我们就不使用NSTimer

{
...
  let spawnEnemy = SKAction.sequence([SKAction.runBlock(
  {
    [unowned self] in 
    self.SpawnEnemies();
  }),SKAction.waitForDuration(1)]);
  let spawnBullet = SKAction.sequence([SKAction.runBlock(
  {
    [unowned self] in
      self.enumerateChildNodesWithName("enemy", usingBlock: 
      {
        (enemy : SKNode,stop: UnsafeMutablePointer <ObjCBool>) in
                   self.SpawnBullets(enemy as! SKSpriteNode);  
      });        
  }),SKAction.waitForDuration(0.2)]);
  let group = SKAction.group([spawnEnemy, spawnBullet])
  self.runAction(SKAction.repeatActionForever(group))

}

此代码未经测试,因此如果我需要更新任何内容,请告诉我。

相关内容

最新更新