【问题标题】:remove SKSpriteNode after 5 seconds5 秒后移除 SKSpriteNode
【发布时间】:2015-10-22 18:12:01
【问题描述】:

如何在我的函数中像这样在 5 秒后删除我的 SKSpriteNode。我尝试使用称为 func 的 NSTimer 删除我的 BonusSprite 但 5 秒后我的应用程序崩溃了:

let timerApparitionBonus = NSTimer.scheduledTimerWithTimeInterval(13, target: self, selector: Selector("ApparitionBonus"), userInfo: nil, repeats: true)

    }

    func ApparitionBonus() {

        var BonusApparitionX = UInt32(self.frame.size.width)
        var BonusApparitionY = UInt32(self.frame.size.height)

        BonusApparitionX = arc4random() % BonusApparitionX
        BonusApparitionY = arc4random() % BonusApparitionY
        BonusSprite.position = CGPointMake(CGFloat(BonusApparitionX),CGFloat(BonusApparitionY))
        BonusSprite.setScale(0.8)
        self.addChild(BonusSprite)
    }

编辑:

这是我来自DidMoveToView 的代码,用于删除我的精灵。

override func didMoveToView(view: SKView) {

    physicsWorld.contactDelegate = self

    //BackGround

    self.scene?.backgroundColor = UIColor.blackColor()
    self.addChild(SKEmitterNode(fileNamed: "MyParticle")!)
    self.scene?.size = CGSize(width: 640, height: 1136)

    //Placement du Vaisseau :

    Vaisseau.setScale(2)
    Vaisseau.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
    Vaisseau.physicsBody = SKPhysicsBody(rectangleOfSize: Vaisseau.size)
    Vaisseau.physicsBody?.affectedByGravity = false
    Vaisseau.physicsBody?.categoryBitMask = PhysicsCategories.Vaisseau
    Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Meteorites
    Vaisseau.physicsBody?.contactTestBitMask = PhysicsCategories.Bonus
    Vaisseau.physicsBody?.dynamic = false
    self.addChild(Vaisseau)

    //Timer créer enemis

    CreationEnemisTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("CreationMeteorites"), userInfo: nil, repeats: true)

    //Score

    timerScore = NSTimer.scheduledTimerWithTimeInterval(0.7, target: self, selector: Selector("ScoreUpper"), userInfo: nil, repeats: true)
    ScoreLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.frame.size.width / 3, height: 20))
    ScoreLabel.center = CGPoint(x : self.frame.size.width / 2,y : self.frame.size.height / 4)
    ScoreLabel.text = "Score : \(Score)"
    ScoreLabel.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 0.3)
    ScoreLabel.textColor = UIColor.whiteColor()
    self.view?.addSubview(ScoreLabel)

    //Aparition des Bonus (timer)

    let myFunction = SKAction.runBlock({self.ApparitionBonus()})
    let wait = SKAction.waitForDuration(5)
    let remove = SKAction.runBlock({self.removeBonus()})

    self.runAction(SKAction.sequence([myFunction, wait, remove]))
}

 

func ApparitionBonus() {

    var BonusApparitionX = UInt32(self.frame.size.width)
    var BonusApparitionY = UInt32(self.frame.size.height)

    BonusApparitionX = arc4random() % BonusApparitionX
    BonusApparitionY = arc4random() % BonusApparitionY

    BonusSprite.position = CGPointMake(CGFloat(BonusApparitionX),CGFloat(BonusApparitionY))
    BonusSprite.setScale(0.8)

    BonusSprite.physicsBody?.categoryBitMask = PhysicsCategories.Bonus
    BonusSprite.physicsBody?.contactTestBitMask = PhysicsCategories.Vaisseau
}

 

func removeBonus() {

    BonusSprite.removeFromParent()
}

【问题讨论】:

    标签: swift sprite-kit swift2


    【解决方案1】:

    试试这个

    编辑:意识到它不会删除精灵,这会起作用。

    class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
          let myFunction = SKAction.runBlock({()in self.ApparitionBonus()})
          let wait = SKAction.waitForDuration(5)
          let remove = SKAction.runBlock({() in self.removeSprite()})
          self.runAction(SKAction.sequence([myFunction, wait, remove]))
        }
        func ApparitionBonus() {
           self.addChild(bonusSprite)
        }
        func removeSprite() {
           bonusSprite.removeFromParent()
        }
    }
    

    【讨论】:

    • 如果你想让它淡出而不是突然消失,你也可以使用SKAction.fadeOutWithDuration(sec: NSTimeInterval)而不是SKAction.removeFromParent()。它在为alpha 设置动画后自动调用removeFromParent()
    • 我想你在 self.ApparitionBonus 和 self.removeSprite 之后忘记了 () ?因为我的编译中有一些错误
    • 当我尝试你的代码时,当我的 Bonus 像这样产生时出现错误:2015-10-22 20:40:19.801 SpaceSurvival[1828:85702] *** 由于未捕获的异常而终止应用程序'NSInvalidArgumentException',原因:'尝试添加已经有父节点的 SKNode: 名称:'(null)' 纹理:[ 'Bonus.png' (100 x 100)] 位置:{243, 606} scale:{0.80, 0.80} size:{80, 80} anchor:{0.5, 0.5} rotation:0.00' *** 第一次抛出调用栈:
    • @MathisDelaunay 在您发布的代码中,例如如果 bonusSprite.parent == nil { self.addChild(bonusSprite) }
    • @DanielMihaila 总是有问题:/
    【解决方案2】:

    // 如果我们通过函数创建一个 SKSpriteNode 看起来像这样!

    func gooseWarnningLabelShow () {
        var spriteNodelabel        = SKSpriteNode(imageNamed: "labelBack2")
        spriteNodelabel.position   = CGPoint(x:CGRectGetMidX(frame), y: frame.size.height*0.90)
        spriteNodelabel.size       = CGSizeMake(frame.size.width*0.70, frame.size.height*0.06)
        spriteNodelabel.alpha      = 0.2
        spriteNodelabel.zPosition  = 21.0
        self.addChild(spriteNodelabel)
        spriteNodelabel.runAction(
            SKAction.sequence([
                SKAction.waitForDuration(5.0),
                SKAction.removeFromParent()
                ])
        )
    }
    

    使用这个函数来创建一个 SKSpriteNode!在该函数中,我们有一个 SKAction,它在 5 秒延迟后执行并删除 SKSpriteNode!

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 2021-09-17
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多