SpriteKit генерации случайных узлов

#swift #xcode #sprite-kit

#swift #xcode #sprite-kit

Вопрос:

Я создаю игру, которая порождает случайных врагов и перемещает их по экрану, чтобы пользователь мог стрелять в spritekit. Проблема, с которой я сталкиваюсь, заключается в обнаружении прикосновения к врагу. Я пробовал множество различных методов, но ничего не работает. Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, что каждый порожденный враг использует одну и ту же переменную. Все, что я действительно хочу знать, это то, как я могу выполнить определенный блок кода при касании одного из «вражеских» спрайтов. Вот моя функция для добавления врага, затем я вызываю эту функцию по таймеру, чтобы добавить врага. Любая помощь была бы весьма признательна, поскольку я потерян и разочарован. Заранее спасибо

 func addEnemy() {

    let distance = CGFloat(self.frame.size.height-150)

    possibleEnemy = GKRandomSource.sharedRandom().arrayByShufflingObjects(in: possibleEnemies) as! [String]

    let enemy = SKSpriteNode(imageNamed: possibleEnemies[0])
    let randomEnemyPosition = GKRandomDistribution(lowestValue: 200, highestValue: Int(distance))


    let position = CGFloat(randomEnemyPosition.nextInt())

    enemy.isUserInteractionEnabled = true
    enemy.name = "(possibleEnemies[0])"
    enemy.position = CGPoint(x:-50, y: position)
    enemy.physicsBody = SKPhysicsBody(rectangleOf: enemy.size)
    enemy.physicsBody?.isDynamic = true
    enemy.physicsBody?.categoryBitMask = enemyCategory
    enemy.physicsBody?.collisionBitMask = 0
    self.addChild(enemy)
    let animationDuration:TimeInterval = 6
    let oscillate = SKAction.oscillation(amplitude: 30, timePeriod: 4, midPoint: enemy.position)
    enemy.run(SKAction.repeatForever(oscillate))
    enemy.run(SKAction.moveBy(x: size.width, y: 0, duration: 5))
    var actionArray = [SKAction]()
    actionArray.append(SKAction.moveTo(x: self.frame.width, duration: animationDuration))
    actionArray.append(SKAction.removeFromParent())
    enemy.run(SKAction.sequence(actionArray))


}
  

Редактировать: код, используемый для определения того, задет ли враг

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches {



        let location = touch.location(in: self)

        if enemy.contains(location) {

            //Run code


        }
    }

}
  

Редактировать: другой метод, используемый для определения, был ли затронут узел

 let touch:UITouch = touches.anyObject()! as UITouch
let positionInScene = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(positionInScene)

if let name = touchedNode.name
{
    if name == "enemy"
    {
        //Run code
    }
}
  

}

Комментарии:

1. Какой код вы используете, чтобы обнаружить, что враг был затронут?

2. Вы можете отличить своего врага, правильно установив «enemy.name » и повторная проверка этого имени для методов делегирования касания

3. @AlessandroOrnano Я попробовал вышеупомянутый метод, который, я думаю, похож на то, что вы говорите, хотя при создании врага для имени установлено значение «враг»

4. Код выглядит хорошо в touchesBegan выглядит хорошо. Пожалуйста, убедитесь, что touchesBegan вызывается хотя бы один раз при нажатии в любом месте сцены.

5. @xpereta да, это работает с другими узлами в сцене, единственная проблема заключается в том, что эти случайно генерируемые вражеские узлы вот почему я так смущен