swift - didBeginContact 没有被称为 Swift

标签 swift sprite-kit skphysicsworld

我正在开发一个应用程序,当中心球的颜色与飞向中心球颜色的较小球相匹配时,玩家得分。 因此,为了使其正常工作,我需要在“敌人”和“主球”发生碰撞时调用 didBeginContact 函数。唯一在移动的是敌人的球,因为它飞向静止的主球 我相信我已经正确设置了位掩码,但是没有调用 didBeginContact 函数。 有人可以帮忙吗?

这是我的代码

struct bitMasks{
static let mainBallMask:UInt32 = 0x1 << 0
static let enemyBall:UInt32 = 0x1 << 1
}
class GameScene: SKScene,SKPhysicsContactDelegate {

var mainBall = SKSpriteNode()
var ballSetToMainColor = true
var enemyTimer = Timer()
var hits = 0

override func didMove(to view: SKView) {
    self.physicsWorld.contactDelegate = self
    mainBall = childNode(withName: "centralBall") as! SKSpriteNode
    mainBall.zPosition = 1.0
    mainBall.physicsBody = SKPhysicsBody(circleOfRadius: mainBall.size.width/2)

    mainBall.physicsBody?.categoryBitMask = bitMasks.mainBallMask
    mainBall.physicsBody?.collisionBitMask = bitMasks.enemyBall
    mainBall.physicsBody?.contactTestBitMask = bitMasks.enemyBall

    mainBall.physicsBody?.isDynamic = false
    mainBall.physicsBody?.affectedByGravity = false
    enemyTimer = Timer.scheduledTimer(timeInterval: 1.5, target: self, selector: #selector(enemies), userInfo: nil, repeats: true)
}


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    touchesCheckForChangedBall(touches: touches)
}

func didBegin(_ contact: SKPhysicsContact) {
    let firstBody = contact.bodyA.node as! SKSpriteNode
    let secondBody = contact.bodyB.node as! SKSpriteNode
    if firstBody.name == "enemy" && secondBody.name == "centralBall"{
        collisionMain(enemy: firstBody)
    }else if firstBody.name == "centralBall" && secondBody.name == "enemy"{
        collisionMain(enemy: secondBody)
    }
}

func collisionMain(enemy: SKSpriteNode){
    hits += 1
    enemy.removeAllActions()
    enemy.removeFromParent()
    print(hits)

}

func touchesCheckForChangedBall(touches: Set<UITouch>){
    for t in touches {
        let location = t.location(in: self)
        let nodes = self.nodes(at: location)
        if nodes.isEmpty == false {
            if let name = nodes[0].name{
                if name == "centralBall"{
                    changeMainBallColor()
                }
            }
        }
    }
}

func changeMainBallColor(){
    ballSetToMainColor = !ballSetToMainColor
    if ballSetToMainColor == true{
        mainBall.texture = SKTexture(imageNamed: "ball-mainColor")
    }else{
        mainBall.texture = SKTexture(imageNamed: "ball-secondaryColor")
    }
}

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
}

func getRandomImageColor()->String{
    let randVal = arc4random_uniform(2)
    if randVal == 0{
       return "ball-secondaryColor"
    }else{
        return "ball-mainColor"
    }
}

func enemies(){
    let color = getRandomImageColor()
    let enemy = SKSpriteNode(imageNamed: color)
    enemy.size = CGSize(width: 30, height: 30)
    enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.width/2)
    enemy.physicsBody?.categoryBitMask = bitMasks.enemyBall
    enemy.physicsBody?.collisionBitMask = bitMasks.mainBallMask
    enemy.physicsBody?.contactTestBitMask = bitMasks.mainBallMask
    enemy.name = "enemyBall"
    enemy.physicsBody?.isDynamic = true
    enemy.physicsBody?.affectedByGravity = false
    let randomPositionNumber = arc4random() % 3
    switch randomPositionNumber{
    case 0:
        enemy.position.x = 0
        let posY = arc4random_uniform(UInt32(frame.size.height))
        enemy.position.y = CGFloat(posY)
        self.addChild(enemy)
        break
    case 1:
        enemy.position.y = frame.size.height
        let posX = arc4random_uniform(UInt32(frame.size.width))
        enemy.position.x = CGFloat(posX)
        self.addChild(enemy)
        break
    case 2:
        enemy.position.x = frame.size.width
        let posY = arc4random_uniform(UInt32(frame.size.height))
        enemy.position.y = CGFloat(posY)
        self.addChild(enemy)
        break
    default:
        break
    }
    enemy.run(SKAction.move(to: mainBall.position, duration: 3))
}
}

最佳答案

问题是他将他的敌人命名为“enemyBall”,但在他的 didBeginContact 中寻找“敌人”这个词。

这就是为什么使用字符串比较不是一个好主意(而且它比其他比较慢)

我建议首先检查 categoryBitmask,然后是名称或类,具体取决于您需要检查的具体程度。

关于swift - didBeginContact 没有被称为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40578790/

相关文章:

xcode - 确定 SpriteNode 何时落在矩形 SpriteNode 上

ios - 在展开可选值时发现 nil - spriteKit

ios - SKPhysicsContactDelegate 不工作

xcode - ConvertPointToView 函数在 Swift Xcode 7 Beta 中不起作用

ios - 无法缩放/缩放带有附加 SKPhysicsJoints 的 SKSpriteNode

ios - 如何在 Laravel 中验证 HTTP 请求

ios - 缓存整个网站 - Swift

swift - 为什么 NSNumber 不尊重语言环境 decimalSeparator

ios - 无法将类型 'NSURL.Type' 的值转换为预期的参数类型 'NSURL?'