【问题标题】:SKPhysicsContactDelegate methods called with PhysicsKit types?使用 PhysicsKit 类型调用的 SKPhysicsContactDelegate 方法?
【发布时间】:2014-05-07 14:07:20
【问题描述】:

我在SKPhysicsBody 中添加了一些方便的方法,以便在SKPhysicsContactDelegate 类的didBeginContact 方法中更轻松地处理它们。

@interface SKPhysicsBody (MyCategory)
-(void)convenience;
@end

似乎委托使用了不同的类型,然后记录在案。当我尝试在 didBeginContact 中使用这种便捷方法时,我得到了一个异常。

尝试以下测试代码时

-(void)didBeginContact:(SKPhysicsContact *)contact {
    NSLog(@"%@, %d", [contact.bodyA class], [contact.bodyA isKindOfClass:[SKPhysicsBody class]]);
}

它会记录

PKPhysicsBody, 0

PKPhysicsBody 是(私有)PhysicsKit 框架的一部分。

虽然SKPhysicsContact 文档明确指出

bodyA
The first body in the contact. (read-only)
@property(readonly, nonatomic) SKPhysicsBody *bodyA

有没有办法解决这个问题,所以我仍然可以使用 SKPhysicsBody 类类别?还是我误解了某些东西,这是预期的行为吗?

【问题讨论】:

    标签: ios sprite-kit skphysicsbody skphysicscontact


    【解决方案1】:

    Well PhysicsBody 可能使用了类集群方法,在 Apple 框架中广泛使用。 您应该使用内置的接触面罩来识别您的物理实体。 就像文档中解释的那样:

    categoryBitMask 定义此物理体所属类别的掩码。

    【讨论】:

    • 我认为有些混淆,“类别”是指“Objective-C 类别”,而不是物理体的类别。 IE。我想使用 @interface SKPhysicsBody (myextension) 之类的方法
    • @Pieter 是的,我知道您想区分物理体的类型并通过自省检查它们,但我建议您使用指定的方式来执行此操作 - categoryBitMask。你想这样做的方式是行不通的。检查这个原因 - developer.apple.com/library/ios/documentation/general/…
    • 不,我想你还是很困惑,我不想通过自省来区分任何东西。我不认为这是一个班级集群问题。如果有一个抽象超类SKPhysicsBody 可以通过,一切都会好起来的。问题是传递的类在运行时未被识别为 SKPhysicsBody 类。如果我只是简单地将@interface SKPhysicsBody (extra) 与一个方法-(void)doSomething { NSLog(@"Boo!"); } 相加,在SKPhysicsContact 内部的主体上调用此方法将崩溃并出现异常。
    • @Pieter 这正是类集群的意义所在。例如 NSArray 或 NSDictionary 与 SKPhysicsBody 相同,在任何时候都不能保证它们的类。因此,您不能只是向它们添加新方法并期望它起作用。由于各种原因,他们在不同时间有不同的内部类,这没关系。没有提到这一点,文档可能是错误的。
    • 当然有不同的内部类是可以的,我的问题是传递的类型不是“抽象超类”类型,因为它应该在类集群中。这不是关于让不同的内部私有类处理事情,而是关于类型不是抽象公共类,根据文档A class cluster is an architecture that groups a number of private, concrete subclasses under a public, abstract superclass. 但也许我完全误解了这一切是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多