是否可以在类/结构实例方法中调用GameScene函数?

时间:2019-06-09 02:16:40

标签: ios xcode sprite-kit

因此,我正在为我的计算机科学课制作一个游戏,并为该游戏中的精灵制作了一个名为Bomb的课。在Bomb类中,我有一个名为blowUp()的函数,当炸弹的倒数计时器关闭时会调用该函数。当时间用完时,炸弹的质地会发生其他变化,但它也应该触发游戏结束。

我在GameScene中有一个gameOver()函数,我想在blowUp()方法中调用它,但是当我这样做时,我收到错误消息“实例成员'gameOver'不能用于'GameScene'类型;您是不是要使用这种类型的值?”

有什么办法解决吗?预先感谢

class Bomb{
    var sprite = SKSpriteNode()
    var timer = Timer()
    var secondsLeft = 20

    func countDown(){
        secondsLeft -= 1
        if secondsLeft == 0{
           blowUp()
        }
    }

    init {

        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {_ in self.countDown()})
    }


    func blowUp(){
        self.timer.invalidate()
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            self.sprite.removeFromParent()
        }
       // gameOver() gives me an error

    }
}

1 个答案:

答案 0 :(得分:0)

这是我要对您的代码进行的更改。

  1. 扩展SKSpriteNode并删除sprite变量,因为您希望炸弹是实际的sprite。

    class Bomb : SKSpriteNode{  
    

    var sprite = SKSpriteNode()
    

  2. 消除计时器。计时器不在现实世界中使用,而是在游戏世界中使用,因此,如果发生任何外部事件(例如电话),您的时间将会关闭。改用SKActions。

    var timer = Timer()
    

    var secondsLeft = SKAction.wait(forDuration:20)

  3. 删除倒数计时功能,爆炸功能和初始化程序,然后将其替换为点火功能

     func countDown(){
         secondsLeft -= 1
         if secondsLeft == 0{
            blowUp()
         }
     }
    
     init {
    
         timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {_ in self.countDown()})
     }
    
    
     func blowUp(){
         self.timer.invalidate()
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
             self.sprite.removeFromParent()
     }
     // gameOver() gives me an error
    
     }
    

    func ignite() {
           var explosionAnimation = SKAction.animate(with:arrayOfExplosionTextures,timePerFrame:0.1666)
           var blowup = SKAction.run{
                            [unowned self] in
                            (self.scene as GameScene).gameOver()                 
                        }
           //var seq = SKAction.sequence([secondsLeft,explosionAnimation,blowup,SKAction.removeFromParent])
           var seq = SKAction.sequence([secondsLeft,blowup,SKAction.removeFromParent])
        }
    

引燃的方法是在准备启动炸弹时先启动炸弹,等待30秒,然后爆炸。这样,您就可以在屏幕上放置延迟或发呆的炸弹。

这是您的班级样子:

    class Bomb : SKSpriteNode{
        var secondsLeft = SKAction.wait(forDuration:20)

        func ignite() {
           //var explosionAnimation = SKAction.animate(with:arrayOfExplosionTextures,timePerFrame:0.1666)
           var blowup = SKAction.run{
                            [unowned self] in
                            (self.scene as GameScene).gameOver()                 
                        }
           //var seq = SKAction.sequence([secondsLeft,explosionAnimation,blowup,SKAction.removeFromParent])
           var seq = SKAction.sequence([secondsLeft,blowup,SKAction.removeFromParent])
        }
    }

这是您在游戏场景中的使用方式:

func placeBomb(x:CGFloat,y:CGFloat){
    let bomb = Bomb(imageNamed:"bomb")
    addChild(bomb)
    bomb.position = CGPoint(x:x,y:y)
    bomb.ignite() 
}