2013-04-18 46 views
0

我意識到CCPhysicsSprite與CCSprite在幾個方面有所不同。例如,您必須在設置精靈的位置之前設置主體。我認爲這是我嘗試銷燬機體時導致EXC_BAD_ACCESS錯誤的其中一個差異。我在更新方法中調用scheduleSprite方法。如何破壞CCPhysicsSprite的身體

-(void)scheduleSprite { 

if ([testSprite physicsSprite].b2Body != NULL) { 
b2Vec2 force = b2Vec2(-5, 10.0 * [testSprite physicsSprite].b2Body->GetMass()); 
[testSprite physicsSprite].b2Body->ApplyForce(force, [testSprite physicsSprite].b2Body->GetWorldCenter()); 

if ([testSprite physicsSprite].position.x < 0) { 
world->DestroyBody([testSprite physicsSprite].b2Body); 
[testSprite physicsSprite].b2Body = NULL; 
    } 
} 
} 

我得到一個EXC_BAD_ACCESS指向在

-(CGAffineTransform) nodeToParentTransform 

方法排隊

b2Vec2 pos = _b2Body->GetPosition(); 

,類

CCPhysicsSprite.mm 

感謝之內。

+0

[EXC \ _BAD \ _ACCESS錯誤和在直線水平移動box2d正文時出現奇怪行爲的可能的重複](http://stackoverflow.com/questions/16055026/exc-bad-access-error-and-strange-行爲,當移動box2d身體在直浩) – Morion 2013-04-18 09:44:24

回答

1

儘管你破壞了body,該sprite將繼續儘自己的東西,這樣你就可以將其從父母也精靈,東西like.-

if ([testSprite physicsSprite].position.x < 0) { 
    world->DestroyBody([testSprite physicsSprite].b2Body); 
    [[testSprite physicsSprite] removeFromParentAndCleanup:YES]; 
} 
+0

我剛剛添加上面的代碼,但我仍然得到一個EXC_BAD_ACCESS錯誤。只有這一次,它指向'scheduleSprite'方法中的if([testSprite physicsSprite] .b2Body!= NULL){'''。 – oopology 2013-04-18 08:22:08

+0

Mmh如你之前所做的那樣,將body引用設置爲'null'怎麼辦? (就在'destroy'和'removeFromParent'調用之間) – ssantos 2013-04-18 08:30:14

+0

我也做過了,仍然得到了相同的EXC_BAD_ACCESS錯誤 – oopology 2013-04-18 09:49:38

0
- (void) killBody:(cpBody*)body 
{ 
    cpBodyEachShape_b(body, ^(cpShape *shape) { 
     cpSpaceRemoveShape(_space, shape); 
     cpShapeFree(shape); 
    }); 
    cpSpaceRemoveBody(_space, body); 
    cpBodyFree(body);//edited to include this line 

    CCPhysicsSprite* sprite = (__bridge CCPhysicsSprite*) body->data; 
    [sprite removeFromParentAndCleanup:true]; 
} 

我得到同樣的事情,上面的方法似乎解決了這個問題。 首先,從空間中去除附着在身體上的形狀。我使用_space作爲指向cpSpace對象的實例變量。接下來,從空間中刪除身體。最後,從父級刪除精靈。

當我製作一個CCPhysicsSprite對象時,我使用body-> data將它的主體連接到sprite。你可以在上面的方法中看到。

如果您從CCPhysicsSprite對象開始,您將首先從精靈獲取cpBody對象,然後移除正文和形狀,如上所示。