2012-06-10 47 views
0

我正在用Box2d实现一个C++ .mm文件的Contact Listener。无法从C++文件(Cocos2D/Box2d)中访问对象属性

每当两个气泡相撞时,我想知道,所以我可以执行一些操作。这里是我的代码:

void ContactListener::BeginContact(b2Contact* contact) 
{ 

    b2Body* bodyA = contact->GetFixtureA()->GetBody(); 
    b2Body* bodyB = contact->GetFixtureB()->GetBody(); 
    if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) 
    { 
     BubbleSprite* bNodeA = (BubbleSprite*)bodyA->GetUserData(); 
     BubbleSprite* bNodeB = (BubbleSprite*)bodyB->GetUserData(); 

     BOOL oneIsBeingTouched; 
     if(bNodeA.isDrag == YES || bNodeB.isDrag == YES) oneIsBeingTouched = YES; 
... 

BubbleSprite的有这表明他们是否正在被用户拖动的property BOOL isDrag。我得到的问题是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[CCSprite isDrag]: unrecognized selector sent to instance 0x1ed504a0' 

BubbleSprite是CCSprite的子类。 isDrag已在其文件中正确声明并合成。有没有人对发生了什么有什么想法?由于

+0

这里http://stackoverflow.com/questions/10968425/fxlabel-crash-with-uilabel-error是今天另一个类似的问题,通过重新启动xcode和重新导入某些文件到项目来解决。 –

+0

你提到这个代码是“每当两个气泡发生碰撞”时,但你没有检查碰撞是否在两个气泡之间。如果世界上的每个人都是泡沫,那么这仍然可以,但否则你不能假设碰撞是在两个泡泡之间。 – iforce2d

回答

0

使用

if (bNodeA.drag == YES) ... 

if ([bNodeA isDrag] == YES) ... 
+0

同样的错误。 CCSprite上无法识别的选择器。它应该在BubbleSprite上运行... – user339946

+0

你是否使用子类来自己添加'drag'属性? ['CCSprite'](http://www.cocos2d-iphone.org/api-ref/0.99.0/interface_c_c_sprite.html)和['CCNode'](http://www.cocos2d-iphone.org/ api-ref/0.99.0/interface_c_c_node.html)。 –

+0

是的,isDrag是属性名称。正如我所提到的,BubbleSprite是CCSprite的一个子类。 – user339946

1

我建议使用一个getter,像这样创建你的财产尝试。

@property (nonatomic, assign, getter=isDrag) BOOL dragging; 

当然还有@synthesize它。现在您可以使用-setDragging:[bNodeA isDrag]。没有什么严重的,但应该使代码更容易理解。