首页 > 解决方案 > 是否可以在类/结构实例方法中调用 GameScene 函数?

问题描述

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

我的 GameScene 中有一个 gameOver() 函数,我想在 blowUp() 方法中调用它,但是当我这样做时,我收到错误消息“Instance member 'gameOver' cannot be used on type '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

    }
}

标签: iosxcodesprite-kit

解决方案


以下是我将对您的代码进行的更改。

  1. 扩展 SKSpriteNode 并删除 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])
        }
    

ignite 的作用是在您准备好启动炸弹时启动炸弹,等待 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() 
}

推荐阅读