【问题标题】:Why is my didBeginContact function detecting way too many collisions?为什么我的 didBeginContact 函数检测到太多的碰撞?
【发布时间】:2016-06-25 04:19:32
【问题描述】:

我的 didBeginContact 函数在两个 SKSpriteNode 之间检测到大约 60 次碰撞,而实际上应该只有一个。

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA
    let secondBody = contact.bodyB
    if firstBody.categoryBitMask == bulletCategory && secondBody.categoryBitMask == dragonCategory || firstBody.categoryBitMask == dragonCategory && secondBody.categoryBitMask == bulletCategory{

        print("collision happened")
    }
}

当节点接触时,控制台会多次打印“发生冲突”。

这是我为每个 SKSpriteNode 声明物理体的方式

dragonNode.physicsBody = SKPhysicsBody(texture: dragonNode.texture!, size: CGSizeMake(dragonNode.size.width, dragonNode.size.height))
dragonNode.physicsBody?.affectedByGravity = false              
dragonNode.physicsBody?.dynamic = true
dragonNode.physicsBody?.categoryBitMask = dragonCategory
dragonNode.physicsBody?.collisionBitMask = bulletCategory
dragonNode.physicsBody?.contactTestBitMask = bulletCategory

bulletNode.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
bulletNode.physicsBody?.affectedByGravity = false
bulletNode.physicsBody?.dynamic = true
bulletNode.physicsBody?.categoryBitMask = bulletCategory
bulletNode.physicsBody?.collisionBitMask = dragonCategory
bulletNode.physicsBody?.contactTestBitMask = dragonCategory

这是我完成游戏需要修复的最后一件事,所以如果有人能提供帮助,那就太好了!

【问题讨论】:

    标签: swift sprite-kit xcode7 skphysicsbody


    【解决方案1】:

    这是因为理论上您的游戏以每秒 60 帧的速度运行。因此,它每 60 秒检测一次碰撞并打印警告。您没有输入任何代码说停止检测此碰撞。你总是可以在对象上放一个标志

    dragonNode.collided = true
    

    然后检测碰撞和标志

    if (firstBody.categoryBitMask == bulletCategory && secondBody.categoryBitMask == dragonCategory || firstBody.categoryBitMask == dragonCategory && secondBody.categoryBitMask == bulletCategory) && dragonNode.collided != true {
        dragonNode.collided = true
        print("collision happened")
    }
    

    这样碰撞只会触发一次

    【讨论】:

    • 我需要将 dragonNode.collided 设置为 false 以允许重置吗?
    • 我添加了一个代码示例,说明您可以做什么。显然,您必须在可以写入的 dragonNode 上创建一个属性(例如“碰撞”)或找到另一个要写入的变量来检查。您还必须找到一种方法来重置变量,以便以后可以再次检测到。
    • 在游戏中开发者经常做的事情是当发生碰撞时他们设置一个标志说他们的玩家被击中了,闪现玩家说他们被击中了(让精灵闪烁红色一段时间秒),然后他们在 1.0 秒左右等待持续时间操作,然后将标志重置为 false
    • 很高兴它有帮助,很抱歉在一堆编辑中发送答案。当我想着要说什么时,我不想让你等待答案
    • 你杀了它,伙计!我的程序现在只检测到一次碰撞。是的,我看到答案随着您的编辑不断更新哈哈
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 2019-12-07
    • 1970-01-01
    • 2020-08-02
    • 2017-04-21
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多