SKPhysicsContact Crash的扩展 [英] extension for SKPhysicsContact crashing

查看:0
本文介绍了SKPhysicsContact Crash的扩展的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在用SpriteKit创建一个游戏,它有两个身体之间的碰撞。在设置Body之后,我已经实现了didBegin(_contact:)方法,如下所示:

func didBegin(_ contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask == 0 && contact.bodyB.categoryBitMask == 1 {
        gameOver()
    }
}

它工作得很好。

后来,在查看此方法的文档时,我发现了以下内容:

联系参数中描述的两个物理体未按保证顺序传递

为了安全起见,我在SKPhysicsContact类中扩展了一个函数,用于在两个主体之间交换类别位掩码,如下所示:

extension SKPhysicsContact {

    func bodiesAreFromCategories(_ a: UInt32, and b: UInt32) -> Bool {
        if self.bodyA.categoryBitMask == a && self.bodyB.categoryBitMask == b { return true }
        if self.bodyA.categoryBitMask == b && self.bodyB.categoryBitMask == a { return true }
        return false
    }
}

问题是,当调用该函数时,应用程序崩溃,我得到以下错误:

2017-07-18 13:44:18.548 iSnake Retro[17606:735367]-[PKPhysicsContact BodiesAreFromCategories:and:]:无法识别的选择器发送到实例0x60000028b950

2017-07-18 13:44:18.563 iSnake Retro[17606:735367]*正在终止应用程序,原因为:‘-[PKPhysicsContact BodiesAreFromCategories:and:]:无法识别的选择器已发送到实例0x60000028b950’

推荐答案

这显然是一个错误,回答如下: https://stackoverflow.com/a/33423409/6593818

问题是,联系人的类型是PKPhysicsContact(正如您已经注意到的),即使您显式地告诉它是SKPhysicsContact,并且扩展位于SKPhysicsContact上。您必须能够对PKPhysicsContact进行扩展才能使其起作用。根据这个逻辑,我们可以说目前没有实例方法在SKPhysicsContact扩展中工作。我会说这是SpriteKit的一个错误,你应该提交雷达。类方法仍然有效,因为您在类本身上调用它们。

同时,您应该能够将该方法移动到场景或其他对象中,并在那里成功调用它。

正式声明,这不是SWIFT特有的问题。如果您在SKPhysicsContact上的Objective-C类别中创建相同的方法,您将得到相同的崩溃。

您可以向Apple提交错误报告:

https://developer.apple.com/bug-reporting/

并向社区报告:

https://openradar.appspot.com/search?query=spritekit

然而,您真正想要对代码执行的操作是将类别掩码添加在一起。然后检查和(2+4和4+2始终等于6,无论bodyA和bodyB的顺序如何)。

这是您获得唯一联系人的方法,如果您正确设置了2(2、4、8、16等)的幂的面具

这篇关于SKPhysicsContact Crash的扩展的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆