All pastes #2089524 Raw Edit

Miscellany

public text v1 · immutable
#2089524 ·published 2011-10-12 23:12 UTC
rendered paste body
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);
        }
    }
}