// 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; }
/* 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)); }
/* 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 ); } } }