1

是否可以检索用于创建SKPhysicsBody对象的参数而不单独保留它们?换句话说,有没有办法在创建后从以下对象中获取身体类型(即圆形、矩形、多边形)和相关信息(即半径、大小、路径):

SKPhysicsBody *circleBody = [SKPhysicsBody bodyWithCircleOfRadius:100.0];
SKPhysicsBody *rectangleBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(100.0, 100.0)];

SKPhysicsNode类引用中似乎没有任何属性或方法,如下所示:

SKPhysicsBodyType type = circleBody.bodyType; // Doesn't exist
CGFloat radius = circleBody.radius;           // Doesn't exist

我很惊讶有一些信息可以SKPhysicsBody在创建时传递给一个对象,而这些信息至少以后不能通过只读属性获得。有任何想法吗?

4

2 回答 2

2

一种方法是分析description字符串。例如,记录一个圆形主体会打印以下内容:

<SKPhysicsBody> type:<Circle> representedObject:[(null)]

只要描述字符串在形状类型和未来的 Sprite Kit 版本中保持一致,正则表达式搜索就可以完成这项工作。潜在的脆弱解决方案,但合法。

唯一的另一种方法是使用 ObjC 运行时从属性或 ivars 中读取。尽管这可能构成对私有 API 的使用,并且如果您在实时应用程序上执行此操作,可能会导致应用程序被拒绝。

此代码记录所有私有 PKPhysicsBody 类的属性和 ivars。

SKPhysicsBody* circle = [SKPhysicsBody bodyWithCircleOfRadius:10];
NSLog(@"%@", circle);
NSLog(@"%@", NSStringFromClass([circle class])); // log the 'true' class name

unsigned int num;
objc_property_t* properties = class_copyPropertyList(NSClassFromString(@"PKPhysicsBody"), &num);
for (unsigned i = 0; i < num; i++)
{
    objc_property_t property = properties[i];
    NSLog(@"property: %s", property_getName(property));
}

Ivar* ivars = class_copyIvarList(NSClassFromString(@"PKPhysicsBody"), &num);
for (unsigned i = 0; i < num; i++)
{
    Ivar ivar = ivars[i];
    NSLog(@"ivar: %s", ivar_getName(ivar));
}

由此看来,_shapeType伊瓦尔会给你你想要的东西。

于 2013-11-04T01:16:43.507 回答
0

我找到了一种跟踪此信息的简单方法,假设每个主体都静态绑定到单个节点(就像我的应用程序中的情况一样):

SKPhysicsBody *body = [SKPhysicsBody bodyWithCircleOfRadius:10.0];
node.physicsBody = body;
node.userData = [NSMutableDictionary dictionary];
[node.userData setObject:@"circle" forKey:@"shapeType");
[node.userData setObject:[NSNumber numberWithFloat:10.0] forKey:@"radius"];
于 2013-11-06T14:23:44.827 回答