gpt4 book ai didi

swift - 为什么不调用单独类上的 SKPhysicsContactDelegate

转载 作者:搜寻专家 更新时间:2023-10-31 22:28:51 25 4
gpt4 key购买 nike

我一直在尝试向我的 GameScene 添加联系人委托(delegate):

self.physicsWorld.contactDelegate = ContactManager()

但是,我通过将联系人委托(delegate)(ContactManager 类)放在单独的类中来执行此操作,以避免在我的 GameScene 上有那么多代码。这是我的联系人代表:

class ContactManager : NSObject, SKPhysicsContactDelegate {

func didBegin(_ contact: SKPhysicsContact) {
print("they touched!")
}

}

问题在于,当对象 1 与对象 2 发生碰撞时,它不会运行 didBegin() 方法。但是,我知道问题不在于位掩码,因为我让 GameScene 继承了 SKPhysicsContactDelete 并将委托(delegate)设置为 self 并且方法 didBegin() 起作用了。所以问题是类 ContactManager() 没有正确链接,我如何确保 GameScene 中单独类上的联系人管理器正常工作?

最佳答案

SKPhysicsWorld 上的

contactDelegateunowned(unsafe),这意味着它不会增加保留计数器,也不会被视为可选。

这意味着您有责任保留放入此变量中的任何对象。

在您的代码中 self.physicsWorld.contactDelegate = ContactManager() 您将联系人委托(delegate)设置为 ContactManager 的本地副本。由于没有任何东西保留它,它将立即被丢弃,因为保留计数设置为 0。

这就是为什么在大多数情况下,人们使用 self 作为委托(delegate)的原因,因为你可以保证 self 存在。

要补救这种情况,请确保您有一个保留您的 ContactManger 的属性,这样您就不会在创建时丢失它。

class Example : SKScene
{
let contactManager = ContactManager()
func someKindOfSetup()
{
self.physicsWorld.contactDelegate = contactManager
}
}

来源: https://developer.apple.com/reference/spritekit/skphysicsworld/1449602-contactdelegate

关于swift - 为什么不调用单独类上的 SKPhysicsContactDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41961326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com