/** * CAIStateMove::enter * @date Modified April 21, 2006 */ void CAIStateMove::enter(CAIEntity* poAIEntity, CCharacter* poCharacter) { D3DXVECTOR3 vVelocity(0.0f, 0.0f, 0.0f); D3DXVec3Normalize(NULL, &vVelocity, &poCharacter->getVelocity()); poCharacter->setOrientation(vVelocity); // scale the unit velocity based on the entity's type switch (poCharacter->getType()) { case OBJ_ENEMY_ZOMBIECITIZEN: D3DXVec3Scale(&vVelocity, &vVelocity, ZOMBIE_SPEED); break; case OBJ_ENEMY_GASEOUSCLAY: D3DXVec3Scale(&vVelocity, &vVelocity, GASEOUS_SPEED); break; case OBJ_ENEMY_ICECREAMMAN: D3DXVec3Scale(&vVelocity, &vVelocity, ACIDIC_SPEED); break; case OBJ_ENEMY_QUARTERBACK: D3DXVec3Scale(&vVelocity, &vVelocity, QB_SPEED); break; } poCharacter->setVelocity(vVelocity); }
// ****************************************************************** // Setzt die Position eines Sounds und berechnet die Geschwindigkeit tbResult tbSound::SetPosition(const DWORD dwBuffer, const tbVector3& vPosition, const float fSpeedFactor) // = 1.0f { // Parameter prüfen if(dwBuffer >= m_dwNumBuffers) TB_ERROR_INVALID_VALUE("dwBuffer", TB_ERROR); // Prüfen, ob es überhaupt ein 3D-Sound ist if(!(m_dwFlags & DSBCAPS_CTRL3D)) TB_ERROR("Dies ist kein 3D-Sound!", TB_ERROR); LPDIRECTSOUND3DBUFFER pSoundBuffer(m_pp3DSoundBuffers[dwBuffer]); // Position setzen pSoundBuffer->SetPosition(vPosition.x, vPosition.y, vPosition.z, DS3D_DEFERRED); // Den Geschwindigkeitsvektor berechnen. // m_pllTimeStamps[dwBuffer] enthält den Zeitpunkt, zu dem SetListener das letzte // Mal aufgerufen wurde. Ist m_bJustStarted TRUE, dann ist das hier das erste Mal // und die Geschwindigkeit wird auf null gesetzt. if(m_bJustStarted) { pSoundBuffer->SetVelocity(m_pvStartVelocities[dwBuffer].x, m_pvStartVelocities[dwBuffer].y, m_pvStartVelocities[dwBuffer].z, DS3D_DEFERRED); // Aktuelle Zeit und aktuelle Position als ehemalige eintragen QueryPerformanceCounter((LARGE_INTEGER*)(&m_pllTimeStamps[dwBuffer])); m_pvOldPositions[dwBuffer] = vPosition; m_bJustStarted = FALSE; } else { LONGLONG llCurrentTime; // Differenz zwischen aktueller und alter Zeit berechnen QueryPerformanceCounter((LARGE_INTEGER*)(&llCurrentTime)); double dNumSecsPassed = (double)(llCurrentTime - m_pllTimeStamps[dwBuffer]) / tb_g_dFrequency; // Wenn diese Zeit nur knapp von der Zeit seit dem letzten Frame abweicht, // wird dies als kleiner Fehler gewertet und die tatsächliche Zeit wird benutzt. if(fabs(dNumSecsPassed - tb_g_dNumSecsPassed) < 0.1) dNumSecsPassed = tb_g_dNumSecsPassed; // Zurückgelegte Strecke durch die Zeit teilen. Dadurch erhalten // wir die Geschwindigkeit. tbVector3 vVelocity(((vPosition - m_pvOldPositions[dwBuffer]) / (float)(dNumSecsPassed)) * fSpeedFactor); pSoundBuffer->SetVelocity(vVelocity.x, vVelocity.y, vVelocity.z, DS3D_DEFERRED); // Aktuelle Zeit und aktuelle Position als ehemalige eintragen m_pllTimeStamps[dwBuffer] = llCurrentTime; m_pvOldPositions[dwBuffer] = vPosition; } return TB_OK; }
int KRLLocalCharacter::UpdateListener() { int nRetCode = false; int nResult = false; HRESULT hr = E_FAIL; IKG3DSoundShell* pSoundShell = NULL; float fFaceYaw = 0.0f; D3DXVECTOR3 vFront(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vFrontTop(0.0f, 1.0f, 0.0f); D3DXVECTOR3 vPosition(0.0f, 0.0f, 0.0f); D3DXVECTOR3 vVelocity(0.0f, 0.0f, 0.0f); pSoundShell = g_pRL->m_pSound; KG_PROCESS_SUCCESS(pSoundShell == NULL); fFaceYaw = YawLHToRH(m_fFaceYaw); m_RLCharacter.GetPosition(vPosition); vPosition *= 0.01f; hr = pSoundShell->SetListenerPosition(&vPosition, &vVelocity); KGLOG_COM_PROCESS_ERROR(hr); vFront.x = cosf(fFaceYaw); vFront.y = 0.0f; vFront.z = sinf(fFaceYaw); hr = pSoundShell->SetOrientation(&vFront, &vFrontTop); KGLOG_COM_PROCESS_ERROR(hr); Exit1: nResult = true; Exit0: return nResult; }