コード例 #1
0
	virtual void UpdateBehavior( float timeDelta )
	{
		IGameObject* pGameObject = 0;
		IObjectUtils::GetObject( &pGameObject, m_pBBCommon->enemy_collision_objectid );

		m_pBBCommon->time_to_next_attack -= timeDelta;
		if ( m_pBBCommon->time_to_next_attack <= 0.0f )
		{
			m_pBBCommon->time_to_next_attack += m_pGameObjectParams->attack_speed;

			if (pGameObject && pGameObject->GetBehavior())
			{
				float enemyHealth = pGameObject->GetBehavior()->ReceiveDamage( m_pGameObjectParams->attack_damage );
				if ( enemyHealth <= 0.0f && pGameObject->GetGameObjectType() == EGO_RBC )
				{
					ConsumeRBC();	
					pGameObject = 0;
				}
			}
		}

		if (!pGameObject || pGameObject->GetGameTeam() == EGT_INFECTION)
		{
			m_pBBCommon->enemy_collision_objectid.SetInvalid();
		}
	}
コード例 #2
0
	void CheckForCollisions( IGameObject* pGameObject, AUVec3f& desiredPosition, float frameDelta )
	{
		const AUVec3f& refPos = pGameObject->GetEntity()->GetPosition();
		const float refDist = pGameObject->GetCollisionRadius();

		for (int i=0; i<EGT_COUNT; ++i)
		{
			TGameObjects& data = m_Objects[i];
			TGameObjects::iterator it = data.begin();
			TGameObjects::iterator itEnd = data.end();
			while (it != itEnd)
			{
				IGameObject* pTestObject = *it;
				if (pTestObject != pGameObject)
				{
					const AUVec3f& testObjectPos = pTestObject->GetEntity()->GetPosition();
					float distSqr = (refPos - testObjectPos).MagnitudeSqr();
					float minAllowedDist = refDist + pTestObject->GetCollisionRadius();
					if ( (distSqr <= minAllowedDist * minAllowedDist) && (pGameObject->GetGameTeam() != pTestObject->GetGameTeam()) )
					{
						// Set desired position to edge of collision radii		
						AUVec3f dir = (refPos - testObjectPos).GetNormalised();
						desiredPosition = testObjectPos + dir * minAllowedDist;

						pTestObject->OnCollision( pGameObject );
						pGameObject->OnCollision( pTestObject );
					}
				}

				++it;
			}
		}
	}