Cocos2d iphone ContactListener box2d CoCoCos2D contacted body属性
我有一个建筑节点 它具有以下特性: 在.h文件中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
@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;}