碰撞检测的enumareteChildNodes swift。

问题描述 投票:0回答:1

我正在尝试编写一个单词碰撞检测游戏的代码,问题是在我添加矩形作为单词的背景之前,我所有的代码都是正常的,我可以检测到碰撞并采取相应的行动。

问题是,在我添加矩形作为单词的背景之前,我所有的代码都能正常工作,我可以检测到碰撞并采取相应的行动。

这是我创建word的函数。

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个回答
0
投票

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

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

我试图检测word的帧交点,但我应该检测它的父节点,也就是背景。所以我把word改成了背景,然后创建了一个帮助我访问word的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()
                }
            }
        }
    }

另外,我从苹果的文档中得到了帮助

https:/developer.apple.comdocumentationspritekitsknode1483024-enumeratechildnodes。

谢谢你的努力,我正在继续我的项目。

© www.soinside.com 2019 - 2024. All rights reserved.