gpt4 book ai didi

ios - 无法从 SKPhysicsJoint 向下转换为 SKPhysicsJointPin (SpriteKit)

转载 作者:行者123 更新时间:2023-11-30 13:28:39 26 4
gpt4 key购买 nike

我正在开发一个 SpriteKit 项目。我通过 node.physicalsBody?.joints 访问节点的关节。

它应该包含一个 SKPhysicsJointPin,实际上我得到了一个包含一个 SKPhysicsJoint 对象的数组。

但我无法将其从 SKPhysicsJoint 向下转换为 SKPhysicsJointPin

for joint in (node.physicsBody?.joints)! {
print("Joint found") // Is executed
if let myJoint = joint as? SKPhysicsJointPin {
print("SKPhysicsJointPin object found") // Is not executed
}
}

我创建的关节肯定是一个 SKPhysicsJointPin 对象,但我的程序不执行第二个打印语句。

为什么不能向它低头呢?我是不是偶然发现了一个错误?

谢谢

最佳答案

是的。 +[SKPhysicsJointPin allocWithZone:] 返回一个 PKPhysicsJointRevolute:

             +[SKPhysicsJointPin allocWithZone:]:
000b8bd4 push ebp ; Objective C Implementation defined at 0x1817fc (class)
000b8bd5 mov ebp, esp
000b8bd7 sub esp, 0x18
000b8bda call 0xb8bdf
000b8bdf pop eax ; XREF=+[SKPhysicsJointPin allocWithZone:]+6
000b8be0 mov ecx, dword [ss:ebp+arg_8]
000b8be3 mov edx, dword [ds:eax-0xb8bdf+objc_cls_ref_PKPhysicsJointRevolute] ; objc_cls_ref_PKPhysicsJointRevolute
000b8be9 mov eax, dword [ds:eax-0xb8bdf+0x16e5b0] ; @selector(allocWithZone:)
000b8bef mov dword [ss:esp+0x18+var_10], ecx
000b8bf3 mov dword [ss:esp+0x18+var_14], eax ; argument "selector" for method imp___symbol_stub__objc_msgSend
000b8bf7 mov dword [ss:esp+0x18+var_18], edx ; argument "instance" for method imp___symbol_stub__objc_msgSend
000b8bfa call imp___symbol_stub__objc_msgSend
000b8bff add esp, 0x18
000b8c02 pop ebp
000b8c03 ret
; endp

这是来自PhysicsKit(私有(private)框架)的一个类。在 ObjC 中,这并不重要,因为类型就是我们所说的类型,只要对象响应正确的选择器即可。在 Swift 中,这会造成类型不匹配,因为类型并不只是我们所说的那样。

您可能会在 ObjC 中创建一个桥来使其工作,但您可能会遇到“使用私有(private)框架”问题。桥看起来像这样(未经测试):

// Trust me, compiler, this class will exist at runtime
@class PKPhysicsJoinRevolute;

// And hey, here are some methods that I also promise will exist.
@interface PKPhysicsJointRevolute (Bridge)
@property(nonatomic) CGFloat rotationSpeed;
// ... whatever properties you need ...
@end

但就像我说的,这可能会给你带来麻烦。因此,您可能想要制作一个像(未经测试)这样的 ObjC 包装器

@interface MYPinWrapper : NSObject
@property (nonatomic, readonly, strong) SKPhysicsJointPin *pin;
- (instancetype)initWithPin:(id)pin;
@end

@implementation MYPinWrapper {
- (instancetype)initWithPin:(id)pin {
_pin = (SKPhysicsJointPin *)pin;
}
@end

那么你的 Swift 看起来会是这样的:

for joint in (node.physicsBody?.joints)! {
print("Joint found") // Is executed
let pin = MYPinWrapper(pin: joint).pin // Launder the pin through ObjC
// ... pin should now work like a pin even though it's really a revolute.
}

关于ios - 无法从 SKPhysicsJoint 向下转换为 SKPhysicsJointPin (SpriteKit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36841221/

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