Не удается обнаружить касание при падении SKShapeNode // SpriteKite

У меня есть генератор бомб в GameScene.swift, который добавляет SKShapeNodes в сцену. Каждый SKShapeNode — это физический объект, который падает и имеет имя «бомба». Я хочу определить, когда пользователь касается этих узлов (в середине осени с помощью touchesBegan), но это не работает. Что я делаю не так?

// Bomb Spawner Function
func spawnBomb() {
    let bombHeight = 80
    let bomgWidth = 40
    // Define Bomb
    let bomb = SKShapeNode(rectOf: CGSize(width: bomgWidth,
                                          height: bombHeight))
    bomb.name = "bomb"
    bomb.zPosition = 10
    bomb.isUserInteractionEnabled = true
    bomb.position = CGPoint(x: size.width / 2, y:  size.height / 2)
    bomb.fillColor = SKColor.blue
    // Add Physics Body
    bomb.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: bomgWidth,
                                                         height: bombHeight))
    // Determine Random Position
    let randomPosition = abs(CGFloat(random.nextInt()).truncatingRemainder(dividingBy: size.width))
    bomb.position = CGPoint(x: randomPosition, y: size.height)
    // Add Category BitMask
    bomb.physicsBody?.categoryBitMask = BombCategory
    bomb.physicsBody?.contactTestBitMask = WorldFrameCategory
    // Add to the scene
    addChild(bomb)

}

Обнаружение касания

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch:UITouch = touches.first!
    let positionInScene = touch.location(in: self)
    let touchedNode = self.atPoint(positionInScene)

    if let name = touchedNode.name
    {
        if name == "bomb"
        {
            print("bomb Touched")
        }
    }
}

person user3903960    schedule 23.06.2018    source источник
comment
Я не специалист по играм и никогда этим не занимался. Но я думаю, вы хотите добавить распознаватель сенсорных жестов к каждому объекту бомбы по мере его создания.   -  person Jake    schedule 24.06.2018
comment
Я думаю, что это руководство по RayWenderlich должно помочь вам понять это из.   -  person Jake    schedule 24.06.2018


Ответы (1)


Я подозреваю, что ваша проблема связана с тем, что atPoint возвращает SKNode. У вас есть два способа получить самый верхний узел:

if atPoint(touch.location(in: self)) == childNode(withName: "bomb"){
//run your code
}

Это нормально для отдельных узлов. Лично мне нравится использовать подкласс, поэтому я бы использовал

Бомба класса: SKShapeNode

и просто посмотреть, можно ли самый верхний узел под моим касанием превратить в Бомбу.

if let bomb = atPoint(touch.location(in: self)) as? Bomb {
//...
}

Это позволяет вам переместить типичные для бомбы настройки в подкласс и в целом делает код более читаемым.

person green_knight    schedule 23.06.2018
comment
Я переписал все это дело и использовал эту схему. Я понятия не имею, почему это не работало раньше, хотя. stackoverflow.com/a/41324936/3903960 - person user3903960; 24.06.2018