void World::DoCollisionResponse() { if(!contacts_.empty()) // m_iNumContacts > 0 ) { vector<float> preRelVel; preRelVel.resize(contacts_.size()); vector<float> impulseMag; impulseMag.resize(contacts_.size()); ComputePreimpulseVelocity(preRelVel); ComputeImpulseMagnitude(preRelVel, impulseMag); DoImpulse(impulseMag); } }
//---------------------------------------------------------------------------- void BouncingTetrahedra::DoCollisionResponse () { if (mNumContacts > 0) { float* preRelVelocities = new1<float>(mNumContacts); float* impulseMagnitudes = new1<float>(mNumContacts); ComputePreimpulseVelocity(preRelVelocities); ComputeImpulseMagnitude(preRelVelocities, impulseMagnitudes); DoImpulse(impulseMagnitudes); delete1(preRelVelocities); delete1(impulseMagnitudes); } for (int i = 0; i < NUM_TETRA; ++i) { mTetras[i]->Update(mSimTime, mSimDeltaTime); } }
void ProjectileHandler::HandleProjectiles() { for (int i = 0; i < projectileVector->size(); i++) { if (!projectileVector->at(i)->UpdateLife()) { if (projectileVector->at(i)->explosionData[0] == 1) { //create explosion object with stats from projectile CExplosion* explosion = new CExplosion(projectileVector->at(i)->explosionData[1], projectileVector->at(i)->explosionData[2], projectileVector->at(i)->explosionData[3], projectileVector->at(i)->pos[0] + (projectileVector->at(i)->GetWidth() / 2) - (projectileVector->at(i)->explosionData[1] / 2) , projectileVector->at(i)->pos[1] + (projectileVector->at(i)->GetHeight() / 2) - (projectileVector->at(i)->explosionData[1] / 2), 501); vm->GetSoundPlayer()->PlaySound(explosion_small, 0); //check if any solids (aka damagables) are within range for (int x = 0; x < vm->GetSolidVector()->size(); x++) { CBaseObject * obj = vm->GetSolidVector()->at(x); //calculate distance between proj and obj int distance; distance = sqrt((projectileVector->at(i)->GetX() - (obj->GetX() + obj->GetWidth() / 2))*(projectileVector->at(i)->GetX() - (obj->GetX() + obj->GetWidth() / 2)) + (projectileVector->at(i)->GetY() - (obj->GetY() + obj->GetHeight() / 2)) * (projectileVector->at(i)->GetY() - (obj->GetY() + obj->GetHeight() / 2))); //if proj is almost right on the obj if (distance <= sqrt(obj->GetWidth() / 2 * obj->GetWidth() / 2 + obj->GetHeight() / 2 + obj->GetHeight() / 2) + 8) // 8 + size/2 is the magic distance within which a projectile deals full damage { //take full damage int damage = projectileVector->at(i)->explosionData[3]; obj->TakeDamage(damage); //if the player fired the proj then show dmg numbers and play hit sound if (projectileVector->at(i)->firedByPlayer) { if (vm->GetPlayer() == obj) //if player damages himself { damage /= 3; //lessen the damage } else { vm->GetSoundPlayer()->PlayDamageSound(damage); } CDamageNumber * dmgNumber = new CDamageNumber(damage, obj->GetX() + obj->GetWidth() / 2, obj->GetY()); vm->AddObject(dmgNumber); } } //else if distance is lower than range else if (distance < projectileVector->at(i)->explosionData[1]) { //damage = damage - damage * (distance / range); (linear fall off) int damage = projectileVector->at(i)->explosionData[3] - (projectileVector->at(i)->explosionData[3] * (distance / projectileVector->at(i)->explosionData[1])); obj->TakeDamage(damage); //if the player fired the proj then show dmg numbers and play hit sound if (projectileVector->at(i)->firedByPlayer) { if (vm->GetPlayer() == obj) //if player damages himself { damage /= 3; //lessen the damage //play hurt sound } else { vm->GetSoundPlayer()->PlayDamageSound(damage); } CDamageNumber * dmgNumber = new CDamageNumber(damage, obj->GetX() + obj->GetWidth() / 2, obj->GetY()); vm->AddObject(dmgNumber); } } } vm->AddObject(explosion); vm->DeleteObject(projectileVector->at(i)); DoImpulse(explosion); i--; } } } HandleExplosions(); }