rendered paste bodyvoid 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);
}
}
}