void ContactListener::BeginContact(b2Contact *contact) { GameObject *o1 = (GameObject*)contact->GetFixtureA()->GetBody()->GetUserData(); GameObject *o2 = (GameObject*)contact->GetFixtureB()->GetBody()->GetUserData(); if((IS_PLATFORM(o1, o2) || IS_HORIZONTALPLATFORM(o1, o2) || IS_VERTICALPLATFORM(o1, o2)) && IS_PLAYER(o1, o2)) { double distance = 0.0f; switch (o1.tag) { case PLAYER: positionA = contact->GetFixtureA()->GetBody()->GetPosition(); positionB = contact->GetFixtureB()->GetBody()->GetPosition(); distance = positionA.y - positionB.y; if(distance > 1.325f) { if(o2.tag == HORIZONTALPLATFORM) isTouchingHorizontalPlatform = YES; else if(o2.tag == VERTICALPLATFORM) isTouchingVerticalPlatform = YES; isTouchingPlatform = YES; } break; case HORIZONTALPLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); distance = positionA.y - positionB.y; if(distance > 1.325f) { isTouchingHorizontalPlatform = YES; isTouchingPlatform = YES; } break; case VERTICALPLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); distance = positionA.y - positionB.y; if(distance > 1.325f) { isTouchingVerticalPlatform = YES; isTouchingPlatform = YES; } break; case PLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); distance = positionA.y - positionB.y; if(distance > 1.325f) isTouchingPlatform = YES; break; default: break; } } // Hit detection for winning or losing game if(IS_WIN(o1, o2) && IS_PLAYER(o1, o2)) won = YES; if(IS_GROUND(o1, o2) && IS_PLAYER(o1, o2)) isTouchingGround = YES; if((IS_DEATH(o1, o2) || IS_ENEMY(o1, o2)) && IS_PLAYER(o1, o2)) playerDead = YES; // Hit detection for changing platform or enemy direction if(IS_ENEMYLIMIT(o1, o2) && IS_ENEMY(o1, o2)) changeEnemyDirection = !changeEnemyDirection; if(IS_PLATFORMLIMIT(o1, o2) && IS_VERTICALPLATFORM(o1, o2)) changeVerticalDirection = !changeVerticalDirection; if(IS_PLATFORMLIMIT(o1, o2) && IS_HORIZONTALPLATFORM(o1, o2)) changeHorizontalDirection = !changeHorizontalDirection; if(IS_SWITCH1A(o1, o2) && IS_PLAYER(o1, o2)) { switch (o1.tag) { case PLAYER: positionA = contact->GetFixtureA()->GetBody()->GetPosition(); positionB = contact->GetFixtureB()->GetBody()->GetPosition(); break; case SWITCH1A: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; default: break; } double distance = positionA.y - positionB.y; if(distance < 1.4f) { } else { isTouchingSwitch1A = YES; } } if(IS_SWITCH1B(o1, o2) && IS_PLAYER(o1, o2)) { switch (o1.tag) { case PLAYER: positionA = contact->GetFixtureA()->GetBody()->GetPosition(); positionB = contact->GetFixtureB()->GetBody()->GetPosition(); break; case SWITCH1B: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; default: break; } double distance = positionA.y - positionB.y; if(distance < 1.4f) { } else { isTouchingSwitch1B = YES; } } } void ContactListener::PreSolve(b2Contact *contact, const b2Manifold *oldManifold) { GameObject *o1 = (GameObject*)contact->GetFixtureA()->GetBody()->GetUserData(); GameObject *o2 = (GameObject*)contact->GetFixtureB()->GetBody()->GetUserData(); if((IS_PLATFORM(o1, o2) || IS_HORIZONTALPLATFORM(o1, o2) || IS_VERTICALPLATFORM(o1, o2)) && IS_PLAYER(o1, o2)) { switch (o1.tag) { case PLAYER: positionA = contact->GetFixtureA()->GetBody()->GetPosition(); positionB = contact->GetFixtureB()->GetBody()->GetPosition(); break; case PLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; case HORIZONTALPLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; case VERTICALPLATFORM: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; default: break; } double distance = positionA.y - positionB.y; if(distance < 1.325f) { contact->SetEnabled(false); } else { contact->SetEnabled(true); } } if((IS_SWITCH1B(o1, o2) || IS_SWITCH1A(o1, o2)) && IS_PLAYER(o1, o2)) { switch (o1.tag) { case PLAYER: positionA = contact->GetFixtureA()->GetBody()->GetPosition(); positionB = contact->GetFixtureB()->GetBody()->GetPosition(); break; case SWITCH1B: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; case SWITCH1A: positionA = contact->GetFixtureB()->GetBody()->GetPosition(); positionB = contact->GetFixtureA()->GetBody()->GetPosition(); break; default: break; } double distance = positionA.y - positionB.y; if(distance < 1.4f) { contact->SetEnabled(false); } else { contact->SetEnabled(true); } } if(IS_SPAWN(o1, o2) && IS_PLAYER(o1, o2)) { switch (o1.tag) { case PLAYER: robSpawnLocation = contact->GetFixtureB()->GetBody()->GetPosition(); break; case SPAWN: robSpawnLocation = contact->GetFixtureA()->GetBody()->GetPosition(); break; default: break; } contact->SetEnabled(false); } if((IS_PLATFORMLIMIT(o1, o2) || IS_ENEMYLIMIT(o1, o2) || IS_DEATH(o1, o2) || IS_WIN(o1, o2)) && IS_PLAYER(o1, o2)) contact->SetEnabled(false); if(IS_ENEMY(o1, o2) && (IS_GROUND(o1, o2) || IS_PLATFORM(o1, o2) || IS_ENEMYLIMIT(o1, o2))) contact->SetEnabled(true); else if(IS_ENEMY(o1, o2)) contact->SetEnabled(false); if(IS_ENEMY(o1, o2) && IS_PLAYER(o1, o2)) { switch(o1.tag) { case PLAYER: velocityA = contact->GetFixtureA()->GetBody()->GetLinearVelocity(); break; case ENEMY: velocityA = contact->GetFixtureB()->GetBody()->GetLinearVelocity(); break; default: break; } if((velocityA).x > 10.0f || (velocityA).x < -10.0f) { // CCLOG(@"You killed the enemy"); contact->SetEnabled(false); } else { // CCLOG(@"Ouch you got hit!"); contact->SetEnabled(true); } } }