Hi, i have been pulling my hair out over this code for about a week now, i have 3 different kinds of eggs, normal, bad eggs, golden eggs normal egg will give you 1 points, bad egg will -1 point and golden egg will +10 points.
when a bad egg is collected it does -1 but when either a golden egg or a normal egg is collected it gives +11, and putting CCLogs in the contact listeners shows both the if statments for normal and golden are being called and i just cant figure it out, i have re-wrote it, renamed things, changed things but no joy.
im hoping one of you guys will look at this and say "what a n00b, you put abc when it should be xyz, go read this bla bla"
that would be very helpful.
here is my scene:
Defining the bits
#define kCategoryGround 0x01
#define kCategoryPaddle 0x02
#define kCategoryNorm 0x04
#define kCategorySmell 0x08
#define kCategoryGolden 0x16
#define kCategoryPegs 0x32
create a paddle:
// Create paddle and add it to the layer
CCSprite *paddle = [CCSprite spriteWithFile:@"goal.png"];
paddle.position = ccp(screenSize.width/2, 50);
paddle.tag = 2;
[self addChild:paddle];
// Create paddle body
b2BodyDef paddleBodyDef;
paddleBodyDef.type = b2_dynamicBody;
paddleBodyDef.position.Set(screenSize.width/2/PTM_RATIO, 50/PTM_RATIO);
paddleBodyDef.userData = paddle;
_paddleBody = world->CreateBody(&paddleBodyDef);
// Create paddle shape
b2PolygonShape paddleShape;
paddleShape.SetAsBox(paddle.contentSize.width/PTM_RATIO/3,
paddle.contentSize.height/PTM_RATIO/3);
// Create shape definition and add to body
b2FixtureDef paddleShapeDef;
paddleShapeDef.shape = &paddleShape;
paddleShapeDef.density = 10.0f;
paddleShapeDef.friction = 0.4f;
paddleShapeDef.restitution = 0.1f;
paddleShapeDef.filter.groupIndex = 2; //int16(-3);
paddleShapeDef.filter.categoryBits = kCategoryPaddle; //uint16(65535);
paddleShapeDef.filter.maskBits = kCategoryGolden | kCategoryNorm | kCategorySmell | kCategoryGround ;
_paddleFixture = _paddleBody->CreateFixture(&paddleShapeDef);
// Restrict paddle along the x axis
b2PrismaticJointDef jointDef;
b2Vec2 worldAxis(1.0f, 0.0f);
jointDef.collideConnected = true;
jointDef.Initialize(_paddleBody, groundBody, _paddleBody->GetWorldCenter(), worldAxis);
world->CreateJoint(&jointDef);
Create my eggs:
#pragma mark Normal Eggs
-(void) tick2: (ccTime) dt
{
// CGSize screenSize = [[CCDirector sharedDirector] winSize];
CCSprite *Egg = [CCSprite spriteWithFile:@"ball.png" rect:CGRectMake(0, 0, 25, 25)];
Egg.position = ccp(160, 420);
Egg.tag = 1;
[self addChild:Egg];
// Create ball body
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(160/PTM_RATIO, 420/PTM_RATIO);
ballBodyDef.userData = Egg;
ballBody = world->CreateBody(&ballBodyDef);
ballBodyDef.angularDamping = 0.9f;
// Create circle shape
b2CircleShape circle;
float radiusInMeters = (Egg.contentSize.width / PTM_RATIO) * 0.5f;
circle.m_radius = radiusInMeters;
// Create shape definition and add to body
b2FixtureDef ballShapeDef;
ballShapeDef.shape = &circle;
ballShapeDef.density = 5.0f;
ballShapeDef.friction = 10.f;
ballShapeDef.restitution = 0.1f;
ballShapeDef.filter.groupIndex = -3; //int16(-3);
ballShapeDef.filter.categoryBits = kCategoryNorm; //uint16(65535);
ballShapeDef.filter.maskBits = kCategoryGround| kCategoryPaddle;
_ballFixture = ballBody->CreateFixture(&ballShapeDef);
int fromNumber = -6;
int toNumber = 10;
daForce = (arc4random()%(toNumber-fromNumber))+fromNumber;
// NSLog(@"its %i", daForce);
b2Vec2 force = b2Vec2(daForce, 5);
ballBody->ApplyLinearImpulse(force, ballBodyDef.position);
}
#pragma mark Bad Eggs
-(void) tickSmell: (ccTime) dt
{
// CGSize screenSize = [[CCDirector sharedDirector] winSize];
int fromNo = 0;
int toNo = 10;
smell = (arc4random()%(toNo-fromNo))+fromNo;
// NSLog(@"its %i", daForce);
if (smell == 5) {
CCSprite *Smelly = [CCSprite spriteWithFile:@"graphicEggRotten.png" rect:CGRectMake(0, 0, 25, 25)];
Smelly.position = ccp(160, 420);
Smelly.tag = 1;
[self addChild:Smelly];
// Create ball body
b2BodyDef badEggBodyDef;
badEggBodyDef.type = b2_dynamicBody;
badEggBodyDef.position.Set(160/PTM_RATIO, 420/PTM_RATIO);
badEggBodyDef.userData = Smelly;
badEggBody = world->CreateBody(&badEggBodyDef);
badEggBodyDef.angularDamping = 0.9f;
// Create circle shape
b2CircleShape circle;
float radiusInMeters = (Smelly.contentSize.width / PTM_RATIO) * 0.5f;
circle.m_radius = radiusInMeters;
// Create shape definition and add to body
b2FixtureDef badEggShapeDef;
badEggShapeDef.shape = &circle;
badEggShapeDef.density = 5.0f;
badEggShapeDef.friction = 10.f;
badEggShapeDef.restitution = 0.1f;
badEggShapeDef.filter.groupIndex = -3; //int16(-3);
badEggShapeDef.filter.categoryBits = kCategorySmell; //uint16(65535);
badEggShapeDef.filter.maskBits = kCategoryGround | kCategoryPaddle;
_badEggFixture = badEggBody->CreateFixture(&badEggShapeDef);
int fromNumber = -6;
int toNumber = 10;
daForce = (arc4random()%(toNumber-fromNumber))+fromNumber;
NSLog(@"its %i", daForce);
b2Vec2 force = b2Vec2(daForce, 5);
badEggBody->ApplyLinearImpulse(force, badEggBodyDef.position);
}
}
#pragma mark Gold Eggs
-(void) tickGold: (ccTime) dt
{
// CGSize screenSize = [[CCDirector sharedDirector] winSize];
int fromNo = 0;
int toNo = 10;
gold = (arc4random()%(toNo-fromNo))+fromNo;
// NSLog(@"its %i", daForce);
if (gold == 5) {
CCSprite *Goldy = [CCSprite spriteWithFile:@"graphicEggGolden.png" rect:CGRectMake(0, 0, 25, 25)];
Goldy.position = ccp(160, 420);
Goldy.tag = 1;
[self addChild:Goldy];
// Create Golden Egg body
b2BodyDef goldEggBodyDef;
goldEggBodyDef.type = b2_dynamicBody;
goldEggBodyDef.position.Set(160/PTM_RATIO, 420/PTM_RATIO);
goldEggBodyDef.userData = Goldy;
goldEggBody = world->CreateBody(&goldEggBodyDef);
goldEggBodyDef.angularDamping = 0.9f;
// Create circle shape
b2CircleShape circle;
float radiusInMeters = (Goldy.contentSize.width / PTM_RATIO) * 0.5f;
circle.m_radius = radiusInMeters;
// Create shape definition and add to body
b2FixtureDef goldEggShapeDef;
goldEggShapeDef.shape = &circle;
goldEggShapeDef.density = 5.0f;
goldEggShapeDef.friction = 10.f;
goldEggShapeDef.restitution = 0.1f;
goldEggShapeDef.filter.groupIndex = -3; //int16(-3);
goldEggShapeDef.filter.categoryBits = kCategoryGolden; //uint16(65535);
goldEggShapeDef.filter.maskBits = kCategoryGround | kCategoryPaddle;
_goldEggFixture = goldEggBody->CreateFixture(&goldEggShapeDef);
int fromNumber = -6;
int toNumber = 10;
daForce = (arc4random()%(toNumber-fromNumber))+fromNumber;
NSLog(@"its %i", daForce);
b2Vec2 force = b2Vec2(daForce, 5);
goldEggBody->ApplyLinearImpulse(force, goldEggBodyDef.position);
}
}
my collision detection / contact listener:
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
if ((contact.fixtureA->GetFilterData().categoryBits & kCategoryNorm &&
contact.fixtureB->GetFilterData().categoryBits & kCategoryPaddle) ||
(contact.fixtureB->GetFilterData().categoryBits & kCategoryNorm &&
contact.fixtureA->GetFilterData().categoryBits & kCategoryPaddle)) {
NSLog(@"Normal Egg Caught");
//increase the score by 1
score = score + 1;
[scoreLabel setString: [NSString stringWithFormat:@"%d",score]];
}
if ((contact.fixtureA->GetFilterData().categoryBits & kCategoryGolden &&
contact.fixtureB->GetFilterData().categoryBits & kCategoryPaddle) ||
(contact.fixtureB->GetFilterData().categoryBits & kCategoryGolden &&
contact.fixtureA->GetFilterData().categoryBits & kCategoryPaddle)) {
NSLog(@"Golden Egg Caught");
//increase the score by 10
score = score + 9;
[scoreLabel setString: [NSString stringWithFormat:@"%d",score]];
NSString* playedTenSeconds = @"ID_Golden_Egg";
GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
GKAchievement* achievement = [gkHelper getAchievementByID:playedTenSeconds];
if (achievement.completed == NO)
{
float percent = achievement.percentComplete + 100;
[gkHelper reportAchievementWithID:playedTenSeconds percentComplete:percent];
}
}
if ((contact.fixtureA->GetFilterData().categoryBits & kCategorySmell &&
contact.fixtureB->GetFilterData().categoryBits & kCategoryPaddle) ||
(contact.fixtureB->GetFilterData().categoryBits & kCategorySmell &&
contact.fixtureA->GetFilterData().categoryBits & kCategoryPaddle)) {
NSLog(@"Bad Egg Caught");
//decrease the score by 1
score = score - 1;
[scoreLabel setString: [NSString stringWithFormat:@"%d",score]];
NSString* badegg = @"ID_Bad_Egg";
GameKitHelper* gkHelper = [GameKitHelper sharedGameKitHelper];
GKAchievement* achievement = [gkHelper getAchievementByID:badegg];
if (achievement.completed == NO)
{
float percent = achievement.percentComplete + 100;
[gkHelper reportAchievementWithID:badegg percentComplete:percent];
}
}
b2Body *bodyA = contact.fixtureA->GetBody();
b2Body *bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
CCSprite *spriteA = (CCSprite *) bodyA->GetUserData();
CCSprite *spriteB = (CCSprite *) bodyB->GetUserData();
// Sprite A = ball, Sprite B = Block
if (spriteA.tag == 1 && spriteB.tag == 2) {
if (std::find(toDestroy.begin(), toDestroy.end(), bodyA) == toDestroy.end()) {
toDestroy.push_back(bodyA);
}
}
// Sprite B = Ball, Sprite A = Block
if (spriteA.tag == 2 && spriteB.tag == 1) {
if (std::find(toDestroy.begin(), toDestroy.end(), bodyB) == toDestroy.end()) {
toDestroy.push_back(bodyB);
}
}
}
}
std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
b2Body *body = *pos2;
if (body->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *) body->GetUserData();
[self removeChild:sprite cleanup:YES];
}
// NSLog(@"destroying body");
world->DestroyBody(body);
CCLOG(@"1 <- ballbody was Deleted!");
}
Please help me figure this out, ANY help is appreciated.
Regards
Jonn4y