Reputation: 69
When i run this code application crashes.
#import "HelloWorldLayer.h"
CCSprite *background,*ball;
CGSize size;
#define PTM_RATIO 32
@implementation HelloWorldLayer
-(id) init
{
if( (self=[super init])) {
size=[[CCDirector sharedDirector]winSize];
background=[CCSprite spriteWithFile:@"Terrain.png"];
background.position=ccp(size.width/2, size.height/2);
[self addChild:background];
b2Vec2 gravity=b2Vec2(0.0f,-10.0f);
world=new b2World(gravity);
b2BodyDef groundDef;
groundDef.position.Set(0,0);
groundBody=world->CreateBody(&groundDef);
b2EdgeShape groundEdge;
b2FixtureDef groundBodyFixtureDef;
groundBodyFixtureDef.shape=&groundEdge;
groundEdge.Set(b2Vec2(0,0), b2Vec2(size.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBodyFixtureDef);
groundEdge.Set(b2Vec2(0,size.height/PTM_RATIO), b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO));
groundBody->CreateFixture(&groundBodyFixtureDef);
groundEdge.Set(b2Vec2(size.width/PTM_RATIO,0), b2Vec2(size.width/PTM_RATIO,size.height/PTM_RATIO));
groundBody->CreateFixture(&groundBodyFixtureDef);
groundEdge.Set(b2Vec2(0,0), b2Vec2(0,size.height/PTM_RATIO));
groundBody->CreateFixture(&groundBodyFixtureDef);
ball=[CCSprite spriteWithFile:@"ball1.png"];
ball.position=ccp(200, 300);
[self addChild:ball];
b2BodyDef ballBodyDef;
ballBodyDef.type=b2_dynamicBody;
ballBodyDef.position.Set(200/PTM_RATIO, 300/PTM_RATIO);
ballBodyDef.userData=&ball;
ballBodyDef.fixedRotation=true;
ballbody=world->CreateBody(&ballBodyDef);
b2CircleShape ballShape;
ballShape.m_radius=ball.contentSize.width/PTM_RATIO/2;
b2FixtureDef ballBodyFixture;
ballBodyFixture.shape=&ballShape;
ballBodyFixture.density=20.0f;
ballBodyFixture.friction=0.0f;
ballBodyFixture.restitution=1.0f;
ballbody->CreateFixture(&ballBodyFixture);
[self schedule:@selector(tick:)];
}
return self;
}
-(void)tick:(ccTime)dt
{
world->Step(dt, 10, 10);
for(b2Body *b=world->GetBodyList();b;b=b->GetNext())
{
if(b->GetUserData()!=NULL)
{
CCSprite *balldata=(CCSprite *)b->GetUserData();
NSLog(@"Inside if");
balldata.position=ccp(b->GetPosition().x*PTM_RATIO, b->GetPosition().y*PTM_RATIO); // When control comes on this line that time application crash
ball1.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}
-(void) dealloc
{
[super dealloc];
}
@end
I know this code is true and i was use this code so many time but in my current application this code stop debugging and gives error like this.
-(void) update: (ccTime) dt
{
if( elapsed == - 1)
elapsed = 0;
else
elapsed += dt;
if( elapsed >= interval ) {
impMethod(target, selector, elapsed); // EXC_BAD_ACCESS
elapsed = 0;
}
}
This code is in CCTime class. In my code i am not using update method so why this error occur???? Please help me.This is a silly error but can not understand why they come...
Thanks
Upvotes: 0
Views: 158
Reputation: 3751
When you try to get the userdata associated with your body:
CCSprite *balldata=(CCSprite *)b->GetUserData();
It is likely that balldata would be null here, which subsequently causes the crash in the next statement.
Why null? Because, earlier on, when you were setting your userdata, you passed &ball (this will get you a pointer to a pointer!) instead of just ball (already a pointer to your required CCSprite object) to the body definition. So, simply change that assignment to:
ballBodyDef.userData=ball; //not &ball
Upvotes: 1