Проблема столкновения SpriteKit между двумя объектами, управляемыми касанием экрана - PullRequest
0 голосов
/ 23 июня 2018

Я не могу заставить космический корабль и врага2 столкнуться. Он не дает визуально или в области отладки никаких признаков того, что он столкнулся. И то, и другое контролируется касаниями экрана, а остальные нет.

Космический корабль столкнется с врагом и золотой монетой. Враг2 столкнется с врагом. Я пометил две секции внизу, которые, как мне кажется, вызывают проблему.

Впервые в кодировании, поэтому были бы полезны твердые объяснения с визуальной помощью.

override func didEvaluateActions() {
    checkCollisions()
}



func spaceshipHit(goldCoin: SKSpriteNode) {
   // added for score jan 13
    goldcoinCount += 1
    goldCoin.removeFromParent()
}

func spaceshipHit2(enemy: SKSpriteNode) {
    enemy.removeFromParent()
}



func spaceshipHit(enemy: SKSpriteNode) {
    invincible = true
    // added for score attempt jan 13
    lives -= 1
    print(lives)
    enemy.removeFromParent()
    let blinkTimes = 10.0
    let duration = 3.0
    let blinkAction = SKAction.customAction(withDuration: duration) { node, elapsedTime in
        let slice = duration / blinkTimes
        let remainder = Double(elapsedTime).truncatingRemainder(
            dividingBy: slice)
        node.isHidden = remainder > slice / 2
    }
    let setHidden = SKAction.run() { [weak self] in
        self?.spaceship.isHidden = false
        self?.invincible = false
    }
    spaceship.run(SKAction.sequence([blinkAction, setHidden]))

}

Это блок кода, который, я думаю, не активируется.

func spaceshipHit(enemy2: SKSpriteNode) {
    invincible = true
    lives -= 1
    print(lives)

    let blinkTimes = 10.0
    let duration = 3.0
    let blinkAction = SKAction.customAction(withDuration: duration) { node, elapsedTime in
        let slice = duration / blinkTimes
        let remainder = Double(elapsedTime).truncatingRemainder(
            dividingBy: slice)
        node.isHidden = remainder > slice / 2
    }
    let setHidden = SKAction.run() { [weak self] in
        self?.spaceship.isHidden = false
        self?.invincible = false
    }
    spaceship.run(SKAction.sequence([blinkAction, setHidden]))

}


func checkCollisions() {

    var hitGoldCoins: [SKSpriteNode] = []
    enumerateChildNodes(withName: "goldCoin") { node, _ in
        let goldCoin = node as! SKSpriteNode
        if goldCoin.frame.intersects(self.spaceship.frame) {
            hitGoldCoins.append(goldCoin)
        }
    }

    for goldCoin in hitGoldCoins {
        spaceshipHit(goldCoin: goldCoin)
    }

    if invincible {
        return
    }

    var hitEnemiesToEnemies: [SKSpriteNode] = []
    enumerateChildNodes(withName: "enemy") { node, _ in
        let enemy = node as! SKSpriteNode
        if node.frame.insetBy(dx: 20, dy: 20).intersects(
        self.enemy2.frame) {
        hitEnemiesToEnemies.append(enemy)
        }
    }

    for enemy in hitEnemiesToEnemies {
        spaceshipHit2(enemy:enemy)
    }


    var hitEnemies: [SKSpriteNode] = []
    enumerateChildNodes(withName: "enemy") { node, _ in
        let enemy = node as! SKSpriteNode
        if node.frame.insetBy(dx: 20, dy: 20).intersects(
            self.spaceship.frame) {
            hitEnemies.append(enemy)

        }
    }

    for enemy in hitEnemies {
        spaceshipHit(enemy: enemy)
    }

    if invincible {
        return
    }

Это еще один подозрительный раздел.

    var hitEnemies2: [SKSpriteNode] = []
    enumerateChildNodes(withName: "enemy2") { node, _ in
        let enemy2 = node as! SKSpriteNode
        if enemy2.frame.intersects(
            self.spaceship.frame) {
            hitEnemies2.append(enemy2)
        }
    }


    // this is the section that trys to get the ship to hit shadow enemy
    /*var hitEnemies2: [SKSpriteNode] = []
    enumerateChildNodes(withName: "enemy2") { node, _ in
        let enemy2 = node as! SKSpriteNode
        if node.frame.insetBy(dx: 20, dy: 20).intersects(
            self.spaceship.frame) {
            hitEnemies2.append(enemy2)
        }
    }
    */


    for enemy2 in hitEnemies2 {
        spaceshipHit(enemy2: enemy2)
    }


}

1 Ответ

0 голосов
/ 24 июня 2018

Судя по тому, что я вижу, вы никогда не назначаете "врага2" имени своего врага, поэтому enumerateChildNodes(withName: "enemy2") { node, _ in let enemy2 = node as! SKSpriteNode if enemy2.frame.intersects( self.spaceship.frame) { hitEnemies2.append(enemy2) } }

должно быть пустым, что означает, что ни один узел не ударил.

...