我有构建CCNode
它有财产:
<。>文件中的
@property (nonatomic) int testProperty;
<。>在.mm文件中添加标记并设置属性
[[GB2ShapeCache sharedShapeCache] addShapesWithFile:@"Objects.plist"];
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
batchNode = [CCSpriteBatchNode batchNodeWithFile:@"sprite.png"];
[self addChild:batchNode];
[[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"sprite.plist"];
sprite = [CCSprite spriteWithSpriteFrameName:[NSString stringWithFormat:@"%@.png", type]];
[batchNode addChild:sprite];
[sprite setTag:2]; //SET TAG
[self setTestProperty:10]; //SET PROPERTY
...
也是ContactListener类 它正常使用此代码,我正在检测标签正常:
#import "ContactListener.h"
#import "Building.h"
void ContactListener::BeginContact(b2Contact* contact)
{
b2Body* bodyA = contact->GetFixtureA()->GetBody();
b2Body* bodyB = contact->GetFixtureB()->GetBody();
Building *buildA = (Building *)bodyA->GetUserData();
Building *buildB = (Building *)bodyB->GetUserData();
if (buildA.tag == 2) {
NSLog(@"Collision with building");
}
}
问题: 我不明白如何从ContactListener获取属性
我试着这么做:
if (buildA.tag == 2) {
NSLog(@"Collision with building");
NSLog(@"testProperty == %i", buildA.testProperty);
}
但 buildA.testProperty 不起作用,并收到错误
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CCSprite testProperty]: unrecognized selector sent to instance 0x434af0'
如果您可以解释我的请问如何获得此课程的财产。感谢。
答案 0 :(得分:0)
'-[CCSprite testProperty]: unrecognized selector sent to instance 0x434af0'
您将CCSprite存储在userdata中,而不是Building对象。
您可以像这样设置标签,然后检查正确的标签是否有效:
[sprite setTag:2];
但这是不正确的,因为用户数据不是建筑物而是精灵:
Building *buildA = (Building *)bodyA->GetUserData();
我认为Building继承自CCSprite,这就是为什么访问像tag这样的公共属性,而不是构建特定属性。
答案 1 :(得分:0)
当我创建body时,我设置为用户数据精灵。
在Building.h中
body->SetUserData(self);
解决了这个问题。