2017-03-21 3 views
2

3 개의 스프라이트 그룹 (EnemyGroups)이 있고이 그룹은 특정 순서로 정렬되어 있습니다 (각각 하나씩 지연됩니다).SKActions는 특정 값의 변경을 인식하지 못합니다.

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

나는 isStatic = false을 가지고 enemyGroup1enemyGroup2을 설정 : 적 그룹에 대한

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) 
    } 
} 

설정 작업 :

EnemyGroup :

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 
    } 
} 

GameScene의 코드를 참조하십시오 enemyGroup3 ~ isStatic = true. 나는 enemyGroup1enemyGroup2isStatictrue에 행동이 아직도 여전히 enemyGroup1enemyGroup2 as if isStatic = 거짓 . How can I get switchEnemiesOFF() and switchEnemiesON() to recognize changes in the value of isStatic`에서 실행중인 변경? 또한 실행중인 액션에 1 초의 차이가있는 각 그룹의 동일한 순서를 유지하기를 원하기 때문에 작업을 중지하고 싶지 않습니다. 그 대신 if 문으로 일부 기능을 보호했습니다.

답변

1

EnemyGroup을 구조체가 아닌 클래스로 만듭니다.

실행 블록 클로저에서 캡처 된 enemyGroupWithAction 변수는 Struct이므로 (매개 변수로 전달 된 매개 변수의 복사본이기도 함) 매개 변수에서받은 복사본입니다. 이러한 사본은 각각 별도의 값을 가지며 (Struct는 값 유형 임) 별도로 살아갑니다. enemyGroup이 객체 (클래스) 인 경우 참조 만 캡처되고 (클래스는 참조 유형 임) 수정 된 속성이 수정되면 원래 객체 인스턴스에 영향을줍니다.