void InGameState::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { b2Fixture *a = contact->GetFixtureA(), *b=contact->GetFixtureB(); if(contact->IsTouching()){ ActorHook *aData=(ActorHook*)a->GetBody()->GetUserData(); ActorHook *bData=(ActorHook*)b->GetBody()->GetUserData(); float approachVelocity=calculateApproachVelocity(contact); if(isOfTypeUnit(aData->type)){ Unit *unitA= (Unit*)aData->data; if(approachVelocity>8){ unitA->damageUnit(approachVelocity/2); unitA->disturb(5); } } if(isOfTypeUnit(bData->type)){ Unit *unitB= (Unit*)bData->data; if(approachVelocity>8){ unitB->damageUnit(approachVelocity/2); unitB->disturb(5); } } if(aData==NULL||bData==NULL)return; if(isOfTypeUnit(aData->type) && isOfTypeUnit(bData->type)){ /*if(unitA==unitB->p->tower || unitB==unitA->p->tower) contact->SetEnabled(false);*/ } if(aData->type==SPELL_TYPE){ Spell* spell = (Spell*)aData->data; spell->onProjectileContact(a->GetBody(),b->GetBody()); } if(bData->type==SPELL_TYPE){ Spell* spell = (Spell*)bData->data; spell->onProjectileContact(b->GetBody(),a->GetBody()); } } }