我正在制作一款游戏,其中我有一个玩家和无限数量的敌人,这些敌人在一定时间内在给定位置生成。这些敌人正在向玩家发射子弹。我需要能够在 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))
}
此代码未经测试,因此如果我需要更新任何内容,请告诉我。