ContactListener box2d cocos2d联系了body属性

时间:2012-07-29 17:22:37

标签: cocos2d-iphone box2d collision-detection collision

我有构建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'

如果您可以解释我的请问如何获得此课程的财产。感谢。

2 个答案:

答案 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);

解决了这个问题。