Пример #1
0
// Update the scene between rendering
void UpdateScene( float updateTime )
{
	// Call all entity update functions
	EntityManager.UpdateAllEntities( updateTime );

	// Set camera speeds
	// Key F1 used for full screen toggle
	if (KeyHit( Key_F2 )) CameraMoveSpeed = 5.0f;
	if (KeyHit( Key_F3 )) CameraMoveSpeed = 40.0f;

	//Start and stop tanks
	if (KeyHit (Key_1) || KeyHit (Key_2))
	{
		SMessage Message;
		if (KeyHeld(Key_1))
		{
			Message.type = Msg_Stop;
		}
		else
		{
			Message.type = Msg_Go;
		}

		for (int i = 0; i < TankVector.size(); i++)
		{
			Messenger.SendMessage(TankVector.at(i), Message);
		}

	}

	//Show detailed tank information
	if (KeyHit( Key_0 )) ShowTankDetail = !ShowTankDetail;

	// Move the camera
	MainCamera->Control( Key_Up, Key_Down, Key_Left, Key_Right, Key_W, Key_S, Key_A, Key_D, 
	                     CameraMoveSpeed * updateTime, CameraRotSpeed * updateTime );

	//Set Camera to chase a tank.
	if (KeyHit (Key_3) || KeyHit (Key_4))
	{
		if (KeyHeld(Key_3))
		{
			ChaseTankA = !ChaseTankA;
			ChaseTankB = false;
		}
		else
		{
			ChaseTankB = !ChaseTankB;
			ChaseTankA = false;
		}
	}

	if(ChaseTankA)
	{
		if (EntityManager.GetEntity(TankA)!=0)
		{
			MainCamera->Matrix() = EntityManager.GetEntity(TankA)->Matrix();
			MainCamera->Matrix().MoveY(10.0f);
			MainCamera->Matrix().MoveLocalZ(-30.0f);
			MainCamera->Matrix().FaceTarget(EntityManager.GetEntity(TankA)->Matrix().Position());
		}
	}

	if(ChaseTankB)
	{
		if (EntityManager.GetEntity(TankB)!=0)
		{
			MainCamera->Matrix() = EntityManager.GetEntity(TankB)->Matrix();
			MainCamera->Matrix().MoveY(10.0f);
			MainCamera->Matrix().MoveLocalZ(-30.0f);
			MainCamera->Matrix().FaceTarget(EntityManager.GetEntity(TankB)->Matrix().Position());
		}
	}

	AmmoBoxTimer -= updateTime;
	if (AmmoBoxTimer <0)
	{
		CVector3 SpawnPoint;
		float radius = rand()% 200;
		float angle = rand()% 200;

		SpawnPoint.x = (radius *cos(angle));
		SpawnPoint.z = (radius *sin(angle));
		SpawnPoint.y = 1.0f;

		EntityManager.CreateAmmoBox("AmmoBox", &TankVector,"AmmoBox",SpawnPoint, CVector3((0.0f),(0.0f),(0.0f)),CVector3((0.25f),(0.25f),(0.25f)));

		AmmoBoxTimer = 7.5f;
	}

}
	// Draw everything in the scene from the viewpoint of the camera given.
	// If no camera is supplied, the most recently created camera is used.
	void CTLXEngineMod::DrawScene
		(
			ICamera* pCamera
			)
	{
		TL_FN("DrawScene");

		ICamera* pTempCamera = 0;
		if (!pCamera)
		{
			if (m_Cameras.size() > 0)
			{
				pCamera = m_Cameras.back();
			}
			else
			{
				pCamera = pTempCamera = CreateCamera(kManual, 0, 0, 0);
			}
		}
		CTLXCamera* pTLXCamera;
		pTLXCamera = dynamic_cast<CTLXCamera*>(pCamera);

		// Engine based update - FPS cameras, and scene manager preparation
		if (pTLXCamera->GetType() == kFPS)
		{
			static float time = m_pTimer->GetTime();
			float newTime = m_pTimer->GetTime();
			float frameTime = newTime - time;
			time = newTime;
			float moveSpeed = pTLXCamera->GetMovementSpeed() * frameTime;
			float rotSpeed = pTLXCamera->GetRotationSpeed() * frameTime;

			if (KeyHeld(Key_Up))
			{
				pTLXCamera->MoveLocalZ(moveSpeed);
			}
			if (KeyHeld(Key_Down))
			{
				pTLXCamera->MoveLocalZ(-moveSpeed);
			}
			if (KeyHeld(Key_Right))
			{
				pTLXCamera->MoveLocalX(moveSpeed);
			}
			if (KeyHeld(Key_Left))
			{
				pTLXCamera->MoveLocalX(-moveSpeed);
			}
			pTLXCamera->RotateY(GetMouseMovementX() * rotSpeed);
			if (g_bLegacyTL)
			{
				pTLXCamera->RotateX(GetMouseMovementY() * rotSpeed);
			}
			else
			{
				pTLXCamera->RotateLocalX(GetMouseMovementY() * rotSpeed);
			}
			m_pWindow->SetMousePosition(m_pWindow->GetWidth() / 2, m_pWindow->GetHeight() / 2);
		}
		m_pSceneManager->Update();

		// Draw scene
		m_pRenderDevice->ClearBackBuffer(true, 0xC0C0C0);
		m_pRenderDevice->StartRender();
		m_pRenderManager->Render(pTLXCamera->GetAbsPositionMatrix(),
			pTLXCamera->GetProjectionMatrix());
		m_pTextureManager->RenderSprites();
		for (TFontListIter itFont = m_Fonts.begin(); itFont != m_Fonts.end(); ++itFont)
		{
			(*itFont)->DrawTextRequests();
		}
		m_pRenderDevice->FinishRender();
		m_pRenderDevice->FlipBackBuffer();

		if (pTempCamera)
		{
			RemoveCamera(pTempCamera);
		}

		TL_ENDFN;
	}
Пример #3
0
/*
Returns true only if the key is down, but WASN't down last update.
Doesn't need bounds checking - a KeyboardKeys enum is always in range
*/
bool Keyboard::KeyTriggered(KeyboardKeys key)	 {
	return (KeyDown(key) && !KeyHeld(key));
}
Пример #4
0
/*
	Control the camera's position and rotation.
	Amount of motion performed depends on frame time.
	Will control the camera using keys commands from the keyboard
*/
void CCamera::Update(const float frameTime)
{
	if (mSetting == ECameraSetting::FreeRoam)
	{
		float frameRotateValue = gRotSpeed * frameTime;
		float frameMoveValue = gMoveSpeed * frameTime;

		CGameData* gameData = CRenderManager::GetInstance()->GetGameData();

		if (KeyHeld( gameData->mSpeedUp ))
		{
			frameRotateValue *= 2.0f;
			frameMoveValue *= 15.0f;
		}

		// Rotation
		if (KeyHeld( gameData->mTurnUp ))
		{
			RotateLocalX( -frameRotateValue );
		}
		if (KeyHeld( gameData->mTurnDown ))
		{
			RotateLocalX( frameRotateValue );
		}
		if (KeyHeld( gameData->mTurnRight ))
		{
			RotateY( -frameRotateValue );
		}
		if (KeyHeld( gameData->mTurnLeft ))
		{
			RotateY( frameRotateValue );
		}

		// Translation
		if (KeyHeld( gameData->mMoveRight ))
		{
			MoveLocalX( frameMoveValue * 10 );
		}
		if (KeyHeld( gameData->mMoveLeft ))
		{
			MoveLocalX( -frameMoveValue * 10 );
		}
		if (KeyHeld( gameData->mMoveForward ))
		{
			MoveLocalZ( frameMoveValue * 10 );
		}
		if (KeyHeld( gameData->mMoveBackward ))
		{
			MoveLocalZ( -frameMoveValue * 10 );
		}
		if (KeyHeld( gameData->mMoveUp ))
		{
			MoveY( frameMoveValue * 10 );
		}
		if (KeyHeld( gameData->mMoveDown ))
		{
			MoveY( -frameMoveValue * 10 );
		}
	}
}