【问题标题】:enumareteChildNodes with collision detection swiftenumareteChildNodes 与碰撞检测 swift
【发布时间】:2020-05-16 03:02:04
【问题描述】:

我正在尝试编写文字碰撞检测游戏。

问题是,在我添加矩形作为文字的背景之前,我的所有代码都在工作,我可以检测到碰撞并采取行动。但添加矩形后,我必须更改我的单词的父母并将其添加为背景的孩子。

这是我创建单词的功能:

func giveWords() {

    randomIndex = Int.random(in: 0 ..< lastWords.count)

    word = SKLabelNode(text: "\(lastWords[randomIndex])")
    lastWords.remove(at: randomIndex)
    word.fontSize = 17
    word.name = "word"
    word.fontName = "HelveticaNeue-Bold"

    backgroundWord = SKShapeNode(rect: CGRect(x: 0, y: 0, width: (word.frame.width + 3), height: (word.frame.height + 2)), cornerRadius: 4)

    word.physicsBody? = SKPhysicsBody(rectangleOf: self.size)
    word.physicsBody?.collisionBitMask    = 0
    word.physicsBody?.contactTestBitMask  = 0
    word.physicsBody?.categoryBitMask     = 1
    word.physicsBody?.affectedByGravity = false
    word.physicsBody?.isDynamic = false
    word.position = CGPoint(x:(backgroundWord.position.x + word.frame.width/2 + 1 ), y: (backgroundWord.position.y) + 4)

    let number = Int.random(in: 1 ..< 9)
    backgroundWord.position = CGPoint(x: (50 * number), y: 450)

    word.zPosition = 3
    backgroundWord.zPosition = 3
    backgroundWord.addChild(word)
    addChild(backgroundWord)

}

这是我检查碰撞的代码:

func checkCollision() {

    enumerateChildNodes(withName: "word") { (node, _) in

        let word = node as! SKLabelNode

        if self.basketNode.frame.intersects(word.frame) {
            if self.similarWord.contains(word.text!) {
                self.score += 1
                self.scoreLabel.text = "\(self.score)"
                self.takeWord.append(word.text!)
                self.run(self.trueSound)
                self.backgroundWord.removeFromParent()

            } else {
                self.run(self.falseSound)
                self.health -= 1
                self.healthLabel.text = "HP: \(self.health)"
                self.backgroundWord.removeFromParent()

            }
        }
    }
}

我尝试了物理碰撞但我没有处理,所以我选择了这个算法。

函数调用后,self.basketNode.frame.intersects(word.frame) 返回 false,表示未检测到碰撞。

我无法处理为什么没有检测到碰撞。

提前致谢!

【问题讨论】:

    标签: swift background collision-detection skshapenode sklabelnode


    【解决方案1】:

    我解决了,这是答案和原因。

    背后的原因是,我没有检测到self.basketNode.frame.intersects(word.frame)的原因很简单。

    我试图检测单词的框架交叉点,但我应该检测它的父级,即背景。所以我将单词更改为背景,然后创建一个帮助我访问单词的 let。顺便说一句,这是答案...

        func checkCollision() {
    
        enumerateChildNodes(withName: "word") { (node, _) in
            let background = node as! SKShapeNode
            if self.basketNode.frame.intersects(background.frame) {
                if let word = background.childNode(withName: "string word") as? SKLabelNode {
                    if self.similarWord.contains(word.text!) {
                        self.score += 1
                        self.scoreLabel.text = "\(self.score)"
                        self.takeWord.append(word.text!)
                        self.run(self.trueSound)
                        word.removeFromParent()
                        background.removeFromParent()
                    } else {
                        self.run(self.falseSound)
                        self.health -= 1
                        self.healthLabel.text = "HP: \(self.health)"
                        word.removeFromParent()
                        background.removeFromParent()
                    }
                }
            }
        }
    

    顺便说一句,我从 Apple 文档中得到了帮助

    https://developer.apple.com/documentation/spritekit/sknode/1483024-enumeratechildnodes

    感谢您的努力,我将继续我的项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多