void CMonsterAreaInfo::SetMonsterDirection(EMonsterDir eMonsterDir) { m_eMonsterDir = eMonsterDir; D3DXMATRIX matRotation; D3DXVECTOR3 v3Direction(0.0f, 1.0f, 0.0f); float fDegree = 0.0f; switch(m_eMonsterDir) { case DIR_RANDOM: fDegree = (float) random_range(0, 7) * 45.0f; break; case DIR_NORTH: fDegree = 0.0f; break; case DIR_NORTHEAST: fDegree = 45.0f; break; case DIR_EAST: fDegree = 90.0f; break; case DIR_SOUTHEAST: fDegree = 135.0f; break; case DIR_SOUTH: fDegree = 180.0f; break; case DIR_SOUTHWEST: fDegree = 225.0f; break; case DIR_WEST: fDegree = 270.0f; break; case DIR_NORTHWEST: fDegree = 315.0f; break; } D3DXMatrixRotationZ(&matRotation, -D3DXToRadian(fDegree)); D3DXVec3TransformCoord(&v3Direction, &v3Direction, &matRotation); m_v2Monsterdirection.x = v3Direction.x; m_v2Monsterdirection.y = v3Direction.y; D3DXVec2Normalize(&m_v2Monsterdirection, &m_v2Monsterdirection); }
void CTower::Process(float _fDeltaTick) { //Check object tracker valid if (m_pObjTracker) { //Process tracker ProcessTracker(_fDeltaTick); } //Process weapon m_pWeapon->Process(_fDeltaTick); //Set default varuiables unsigned int uiHighestActiveTargetId = 0; bool bAttackedEnemy = false; //Increment fire timer m_fFireTimer += _fDeltaTick; //Loop trough max target id for (unsigned int i = 0; i <= m_uiMaxActiveTargetId; ++i) { //Process target ProcessTargetEnemyStatus(i); //Check tower target valid if (m_ppTargetEnemy[i]) { //Check tower is ready to fire if (m_fFireTimer > m_fFireRate) { //Attack target FireWeaponAtEnemy(m_ppTargetEnemy[i]); //Set attacked enemy to true bAttackedEnemy = true; } //Remember the current highest active enemy id uiHighestActiveTargetId = i; } //Check index equals max active target id //Check index smaller then max targets if (i == m_uiMaxActiveTargetId && i < m_uiMaxTargets - 1) { //Check index does not have a target if (m_ppTargetEnemy[i + 1] == 0) { //Find new target for index ProcessTargetEnemyStatus(i + 1); } } } //Set current max active target id m_uiMaxActiveTargetId = min(uiHighestActiveTargetId, m_uiMaxActiveTargetId); //Check tower had attacked an enemy if (bAttackedEnemy == true) { //Reset fire timer m_fFireTimer = 0; if (m_cpSndFire) { CSoundSystem::GetInstance()->NewSound2DInstant(m_cpSndFire); } } //Process derived class CEntity CEntity::Process(_fDeltaTick); //Process tower mesh m_pObjTower->Process(_fDeltaTick); //Check tower has frost emitter if (m_uiTowerEmitterType & TOWEREMITTER_FROST) { //Default variables CVector3 v3SelfPosition; CEntity::m_mtxWorldMatrix.GetPosition(v3SelfPosition); //Generate random direction CVector3 v3Direction(MathUtility::RandomNumber(-1.5f, 1.5f), MathUtility::RandomNumber(-1.5f, 1.5f), MathUtility::RandomNumber(-1.5f, 1.5f)); //Calcualte emit position v3SelfPosition += m_v3EmitterOffset; //Draw particles m_pRenderer->GetParticleManager().GetParticleInterface().CreateFrostTower(v3SelfPosition, v3Direction, m_fEmitterTime); } }