2012-06-10 76 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]。沒有什麼嚴重的,但應該使代碼更容易理解。