Beispiel #1
0
/**
* 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);
}
Beispiel #2
0
// ******************************************************************
// 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;
}
Beispiel #3
0
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;
}