【问题标题】:Does DidContactBegin Fire Multiple Times at the One TimeDidContactBegin 是否一次触发多次
【发布时间】:2015-10-20 15:20:36
【问题描述】:

我有一个节点同时与其他两个节点联系。我想知道的是,当我的节点(同时)与其他两个节点联系时,didContactBegin 代码是否同时触发,或者是一个 didContactBegin 处理然后下一个。

我会认为一个触发然后下一个,所以为了使第二个或第三个 didContactBegin 不触发,我设置了一个布尔值和一个计时器。但是在这样做之后,我开始认为 didContactBegin 会同时触发,因为我下面的代码似乎经常收到双 println 消息,但并非总是如此。

func didBeginContact(contact: SKPhysicsContact) {

    if contact.bodyA.node?.name == "segment" || contact.bodyB.node?.name == "segment" {

        if boolean == true {
            boolean = false
            timerResetBoolNextAction.invalidate()
            timerResetBoolNextAction = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("ResetBoolean"), userInfo: nil, repeats: false)

            println("boolean is true")
        }

   }  

}


func ResetBoolean() {

    boolNextAction = true

}

无论如何,我想知道的主要事情是 didContactBegin 是一次全部触发还是排队。因为如果它确实排队,我相信我的代码肯定有其他问题。

【问题讨论】:

  • 你是什么意思“经常?”当它两次调用/不调用该函数时会发生什么变化?

标签: swift sprite-kit collision skphysicsbody


【解决方案1】:

如果一个“或”另一个为真,它只会进入 if 语句,所以如果它们同时发生,if 语句将读取第一个子句,它将为真,并将直接进入并执行您的代码“仅一次”。该语句需要在下一帧或循环中再次为真才能再次发生。

希望这能回答你的问题。

【讨论】:

  • 谢谢 Rob,是的,这确实回答了我的问题。我希望每一个陈述都能一个接一个地阅读,因为我不知道有什么办法可以绕过它。收到您的帖子后,我一遍又一遍地检查我的代码(不是上面的代码,这只是一个示例),结果发现我实现的计时器不正确,现在已经修改了它。感谢您的澄清,我现在知道去哪里找了。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 2022-01-25
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
相关资源
最近更新 更多