2013-06-25 1 views
0

Я работаю над игрой. Я столкнулся с проблемой в box2d. Я создал мир и веб-сайт (спрайт, тело), ​​а затем я бросаю веб-сайт на touchhend и селектор тиков, который получает положение спрайта и его дающую ошибку.Ошибка Box2D getPosotion Тема 1: EXC_BAD_ACCESS iPhone

Здесь тик селектор enter image description here

onTouchEnd

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 

    if (freeBody) { 
     [self schedule: @selector(tick:)]; 
     [self schedule:@selector(WebHitsFood:) interval:0.01f]; 

     freeBody->SetType(b2_dynamicBody); 

     //this is the maximum force that can be applied 
     const CGFloat maxForce = 600; 


     //get the location of the end point of the swipe 
     UITouch *myTouch = [touches anyObject]; 
     CGPoint location = [myTouch locationInView:[myTouch view]]; 
     location = [[CCDirector sharedDirector] convertToGL:location]; 


     //get the rotation b/w the start point and the end point 
     CGFloat rotAngle = atan2f(location.y - startPoint.y,location.x - startPoint.x); 

     //the distance of the swipe if the force 
     CGFloat distance = ccpDistance(startPoint, location) * 0.5; 

     //put a cap on the force, too much of it will break the rope 
     if (distance>maxForce) distance = maxForce; 

     //apply force 
     freeBody->ApplyForce(b2Vec2(cosf(rotAngle) * distance, sinf(rotAngle) * distance), freeBody->GetPosition()); 

     //lose the weak reference to the body for next time usage. 
     freeBody = nil; 


    } 
    self.isTouchEnabled = NO; 

} 

и создать веб-метод

-(void) createWeb 
{ 
    freeBodySprite = [CCSprite spriteWithFile:@"web1.png"];//web_ani_6_1 
    //freeBodySprite.position = ccp(100, 300); 
    [self addChild:freeBodySprite z:2 tag:6]; 

    CGPoint startPos = CGPointMake(100, 320/1.25); 

    bodyDef.type = b2_staticBody; 
    bodyDef.position = [self toMeters:startPos]; 
    bodyDef.userData = freeBodySprite; 


    float radiusInMeters = ((freeBodySprite.contentSize.width * freeBodySprite.scale/PTM_RATIO) * 0.5f); 
    shape.m_radius = radiusInMeters; 


    fixtureDef.shape = &shape; 
    fixtureDef.density = 0.5f; 
    fixtureDef.friction = 1.0f; 
    fixtureDef.restitution = 0.0f; 

    circularObstacleBody = world->CreateBody(&bodyDef); 
    stoneFixture = circularObstacleBody->CreateFixture(&fixtureDef); 
    freeBody = circularObstacleBody; 

} 

ответ

0

Вы уверены, что GetPosition() это проблема? Попробуйте добавить строку

float test = b-> GetPosition(). X;

как раз перед тем, который дает вам проблему, чтобы определить, действительно ли проблема с GetPosition() или является ли myActor.position источником exc_bad_access.

+0

я добавил эту линию до myActor.position. и я получаю ту же ошибку на myActor.position. – Zohaib

+0

Итак, когда вы добавили эту строку до предыдущей строки, вы не получили на ней exc_bad_access? Это доказывает, что тело GetPosition() не является причиной вашей проблемы, и проблема связана с пользовательскими данными ccsprite. –

+1

А, я вижу, вы не сохраняете «freebodySprite» где угодно, он потерян. Userdata - это просто указатель, вы несете ответственность за сохранение объекта в памяти. Держите его где-нибудь, и это решит это. Прямо сейчас после того, как метод createweb() завершает работу freebodySprite, выходит за рамки. –

0

Легкий способ исправить эту аварию:

for(b2Body* b= world->GetBodyList(); b; B->GetNext()) 
{ 
    id sprite = b->GetUserData(); 

    if(sprite && [sprite isKindOfClass:[CCSprite class]) 
    { 
     CCSprite *myActor = (CCSprite*) sprite; 

     myActor.position = CGPointMake(b->getPosition().x*PTM_RATIO, b->getPosition().y*PTM_RATIO); 

     myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 
    } 
} 
+0

Я действительно добавил этот код, но когда я бросаю объект, моя игра приостанавливается. и ничего не работает, чем ... и нет ошибки. – Zohaib

+0

шаг за шагом debug и дайте мне знать, где он висит .. – Guru

+0

Я использовал точку останова, но не останавливался нигде. но моя игра вешана – Zohaib