コード例 #1
0
ファイル: World.cpp プロジェクト: Hengplank/kucgbowling
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);
    }
}
コード例 #2
0
//----------------------------------------------------------------------------
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);
    }
}
コード例 #3
0
ファイル: ProjectileHandler.cpp プロジェクト: scaepz/Shapist
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();
}