首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >didBeginContact通过了PKPhyicsObject

didBeginContact通过了PKPhyicsObject
EN

Stack Overflow用户
提问于 2015-10-29 18:48:45
回答 1查看 137关注 0票数 5

我有一个助手方法,它扩展了SKPhysicsContact

代码语言:javascript
复制
extension SKPhysicsContact {

    /// - returns: `[SKPhysicsBody]` containing all the bodies that match `mask`
    func bodiesMatchingCategory(mask: UInt32) -> [SKPhysicsBody] {
        let bodies = [bodyA, bodyB]
        return bodies.filter { ($0.categoryBitMask & mask) != 0 }
    }
}

didBeginContact()中,我在contact中传递的方法上调用此方法。

代码语言:javascript
复制
func didBeginContact(contact: SKPhysicsContact) {
    let ballMask: UInt32 = 0x1 << 2
    let ball = contact.bodiesMatchingCategory(ballMask)
...

有时,我会收到这样的错误消息(比如五分之一),这会使应用程序崩溃:

代码语言:javascript
复制
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x165f2350

我查阅了PKPhysicsContact,它是私有框架(链接)的一部分。SKPhysicsContact看起来只是一个空的类定义,它只公开了PKPhysicsContact的某些属性。

我觉得这是一个目标-C黑客的SpriteKit团队,打破了斯威夫特的强有力的打字。

帮助?

如何确保我总是把SKPhysicsContact拿回来?

我添加了一个检查来测试SKPhysicsContact

代码语言:javascript
复制
let test = contact as Any
print("Test is: \(test)")
guard test is SKPhysicsContact else {
    return
}

它正确地捕捉错误匹配类型。

实际上,它从不返回SKPhysicsContact!!?

我试过在目标C(响应者建议的)中这样做,我也得到了同样的结果。

我有一个关于Apple Dev论坛的讨论,它可能为将来的答案寻求者提供一些帮助。

以下是目标-C代码供参考:

代码语言:javascript
复制
@interface SKPhysicsContact (MatchingBodies)

- (NSArray *)bodiesMatchingCategory:(UInt32)category;

@end

@implementation SKPhysicsContact (MatchingBodies)

- (NSArray *)bodiesMatchingCategory:(UInt32)category {
    NSArray *bodies = @[self.bodyA, self.bodyB];

    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(SKPhysicsBody *body, NSDictionary *bindings) {
        return (body.categoryBitMask & category) != 0;
    }];
    NSArray *matching = [bodies filteredArrayUsingPredicate:predicate];
    return matching;
}

@end

在这里叫:

代码语言:javascript
复制
-(void)didBeginContact:(SKPhysicsContact *)contact
{
    static const uint32_t MarbleContact = 0x1 <<1;  // 2
    static const uint32_t GoalContact = 0x1 <<2;    // 4

    SKPhysicsBody *ball = [contact bodiesMatchingCategory:MarbleContact].firstObject;
    NSLog(@"Ball: %@", ball);
    ...

返回此崩溃:

代码语言:javascript
复制
-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PKPhysicsContact bodiesMatchingCategory:]: unrecognized selector sent to instance 0x17dad9e0'

为苹果添加了Bug报告#23332190

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-29 19:52:59

对于这个简单的代码,我得到了同样的错误:

代码语言:javascript
复制
extension SKPhysicsContact {
    func bodiesMatchingCategory(mask: UInt32) -> [SKPhysicsBody] {
        let bodies = [bodyA, bodyB]
        return bodies.filter { ($0.categoryBitMask & mask) != 0 }
    }
}

let contact = SKPhysicsContact()
let body = contact.bodiesMatchingCategory(0)

问题是,contact的类型是PKPhysicsContact (正如您已经注意到的),即使您明确告诉它是一个SKPhysicsContact,并且扩展位于SKPhysicsContact上。您必须能够对PKPhysicsContact进行扩展才能工作。根据这个逻辑,我们可以说,目前没有实例方法在SKPhysicsContact扩展中工作。我想说这是SpriteKit的一个bug,您应该文件雷达。类方法仍然工作,因为您在类本身上调用它们。

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

请注意,这并不是一个针对Swift的问题。如果您在SKPhysicsContact上的Objective类中使用相同的方法,您将得到相同的崩溃。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33422332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档