#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 да, это работает с другими узлами в сцене, единственная проблема заключается в том, что эти случайно генерируемые вражеские узлы вот почему я так смущен