Cocos2d iphone ContactListener box2d CoCoCos2D contacted body属性

Cocos2d iphone ContactListener box2d CoCoCos2D contacted body属性,cocos2d-iphone,box2d,collision-detection,collision,Cocos2d Iphone,Box2d,Collision Detection,Collision,我有一个建筑节点 它具有以下特性: 在.h文件中 @property (nonatomic) int testProperty; 在.mm文件中添加标签并设置属性 [[GB2ShapeCache sharedShapeCache] addShapesWithFile:@"Objects.plist"]; [CCTexture2D PVRImagesHavePremultipliedAlpha:YES]; [CCTexture2D setDefaultAlphaPixelFormat:kCCTe

我有一个建筑节点

它具有以下特性:

在.h文件中

@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'
如果你能解释一下我是如何从这个类中获取属性的。谢谢

'-[CCSprite testProperty]: unrecognized selector sent to instance 0x434af0'
您将CCSprite存储在userdata中,而不是存储在Building对象中

您可以这样设置标记,然后检查标记是否正确:

[sprite setTag:2];
但这是不正确的,因为用户数据不是建筑而是精灵:

Building *buildA = (Building *)bodyA->GetUserData();

我假设建筑继承自CCSprite,这就是为什么访问诸如标记之类的公共属性有效,但不访问建筑特定的属性。

当我创建body时,我设置为用户数据sprite

在大楼里

body->SetUserData(self);

解决了问题。

谢谢你,这是一场令人厌倦的比赛。在我寻找答案之前,我一直明白这一点。但是我怎样才能把我的房子建起来呢?建筑继承CCNode:
@界面建筑:CCNode{b2Body*body;CCSprite*sprite;CCSpriteBatchNode*batchNode;}