【问题标题】:SKActions not recognizing changes in certain valuesSKActions 无法识别某些值的变化
【发布时间】:2017-03-21 21:57:09
【问题描述】:

我有 3 组精灵 (EnemyGroups),这些组按特定顺序排列(每组延迟一秒)。请看代码:

敌人组:

struct EnemyGroup    {
    var enemies : [Enemy]
    var isVisible : Bool
    var isStatic : Bool

    func setup   ()  {
    if isStatic {
        for enemy in enemies  {
            enemy.sprite.alpha = 1.0
            enemy.sprite.isUserInteractionEnabled = false

        }
        isVisible = true
    }
        }


    mutating func switchEnemiesON   ()  {
    if !isStatic {
    for enemy in enemies  {

        enemy.sprite.alpha = 1.0
        enemy.sprite.physicsBody?.categoryBitMask = enemyCategory
        enemy.sprite.physicsBody?.collisionBitMask = bombCategory

    }
    isVisible = true
    }
}

mutating func switchEnemiesOFF   ()  {
    if !isStatic {
        for enemy in enemies  {
        enemy.sprite.alpha = 0.0
        enemy.sprite.physicsBody?.collisionBitMask = 0
        enemy.sprite.physicsBody?.categoryBitMask = 0
    }

    isVisible = false
    }
}

在游戏场景中:

   func groupActionSequence (enemyGroup: EnemyGroup)  {
    for enemy in enemyGroup.enemies {
    var enemyGroupWithAction = enemyGroup
    let groupSequence = SKAction.sequence([
        SKAction.run({ enemyGroupWithAction.switchEnemiesON() }),
        SKAction.wait(forDuration: showTime),
        SKAction.run({ enemyGroupWithAction.switchEnemiesOFF() }),
        SKAction.wait(forDuration: hideTime)
        ])

    let repeatGroupAction = SKAction.repeatForever(groupSequence)
    enemy.sprite.run(repeatGroupAction)
    }
}

func groupActionSequenceWithDelay (delayTime: TimeInterval, enemyGroup: EnemyGroup, groupKey: String)   {
    for enemy in enemyGroup.enemies {

        var group = enemyGroup
    let groupSequence = SKAction.sequence([
        SKAction.run({ group.setup() }),
        SKAction.wait(forDuration: delayTime),
        SKAction.run({ self.groupActionSequence(enemyGroup: enemyGroup) })
        ])

    enemy.sprite.run(groupSequence, withKey: groupKey)
    }
}

为敌方团体设置行动:

 groupActionSequenceWithDelay(delayTime: 0, enemyGroup: enemyGroup1, groupKey: "group1")
 groupActionSequenceWithDelay(delayTime: 1, enemyGroup: enemyGroup2, groupKey: "group2")
 groupActionSequenceWithDelay(delayTime: 2, enemyGroup: enemyGroup3, groupKey: "group3")

我将enemyGroup1enemyGroup2 设置为将isStatic = falseenemyGroup3 设置为isStatic = true。 我将enemyGroup1enemyGroup2 isStatic 更改为true,这些操作仍在enemyGroup1enemyGroup2 as ifisStatic = false. How can I getswitchEnemiesOFF()andswitchEnemiesON()@9876543 上运行? 另外,我不想停止动作,因为我想保持每个组的相同序列在它们的运行动作中具有一秒钟的差异,这就是为什么我用 if 语句来保护一些函数。

【问题讨论】:

    标签: swift swift3 sprite-kit skaction


    【解决方案1】:

    使 EnemyGroup 成为一个类而不是一个结构。

    因为它是一个结构体,所以在 run 块闭包中捕获的enemyGroupWithAction 变量是您在参数中收到的变量的副本(这也是作为参数传递给函数的变量的副本)。这些副本中的每一个都有自己的单独值(Struct 是一种值类型)并且单独存在。如果enemyGroup 是一个对象(类),则只会捕获引用(类是引用类型),并且对is 属性的任何修改都会影响原始对象实例。

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 2020-08-08
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2018-05-27
      • 2014-04-25
      相关资源
      最近更新 更多