2013-04-18 1 views
0

CCPhysicsSprite가 CCSprite와 몇 가지면에서 다르다는 것을 깨달았습니다. 예를 들어, 스프라이트의 위치를 ​​설정하기 전에 본문을 설정해야합니다. 나는 그것이 신체를 파괴하려고 할 때 EXC_BAD_ACCESS 오류를 일으키는 이러한 차이 중 하나라고 생각합니다. update 메서드에서 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 클래스

CCPhysicsSprite.mm 

감사 내에서

-(CGAffineTransform) nodeToParentTransform 

방법에

b2Vec2 pos = _b2Body->GetPosition(); 

라인 가리키는 얻을. 당신이 body을 파괴에도 불구하고

+0

[EXC \ _BAD \ _ACCESS 오류 및 box2d 본문을 직선 수평선으로 이동할 때 이상한 동작이 중복 될 수 있음] (http://stackoverflow.com/questions/16055026/exc-bad-access-error-and-strange- behavior-when-moving-box2d-body-in-straight-ho) – Morion

답변

1

에서, sprite이 물건을 유지할 것이다, 그래서 당신은 또한 부모로부터 스프라이트, 뭔가를 제거 할 수 있습니다 봐라,

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

+0

Mmh 이전에했던 것처럼 본체 참조를 'null'로 설정하는 방법은 무엇입니까? (그냥'destroy'와'removeFromParent' 호출 사이) – ssantos

+0

나는 여전히 EXC_BAD_ACCESS 에러를 가지고있다. – oopology

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를 사용하여 해당 본문을 스프라이트에 연결합니다. 위의 방법에서이를 볼 수 있습니다.

CCPhysicsSprite 개체로 시작하는 경우 먼저 sprite에서 cpBody 개체를 가져온 다음 위의 그림과 같이 본문과 셰이프를 제거합니다.