void Server::RunUpdateLoop() { uint32 realCurrTime = 0; uint32 realPrevTime = GetMSTime(); uint32 prevSleepTime = 0; // used for balanced full tick time length while (_isRunning) { realCurrTime = GetMSTime(); uint32 diff = GetMSTimeDiff(realPrevTime, realCurrTime); _update(diff); realPrevTime = realCurrTime; // diff (D0) include time of previous sleep (d0) + tick time (t0) // we want that next d1 + t1 == _SLEEP_CONST // we can't know next t1 and then can use (t0 + d1) == _SLEEP_CONST requirement // d1 = _SLEEP_CONST - t0 = _SLEEP_CONST - (D0 - d0) = _SLEEP_CONST + d0 - D0 if (diff <= _SLEEP_CONST + prevSleepTime) { prevSleepTime = _SLEEP_CONST + prevSleepTime - diff; ACE_OS::sleep(ACE_Time_Value(0, static_cast<uint64>(prevSleepTime) * 1000L)); } else prevSleepTime = 0; } _cleanup(); }
void GameController::Run() { Player* me = new Player(0,0,1); sObjMgr->CreateWorld(); sObjMgr->Update(); DWORD realCurrTime = 0; DWORD realPrevTime = GetMSTime(); DWORD diff; /* Example for using the sScreenLog class */ sScreenLog->AddTrack(&diff,ScreenLog::Track::UINT,20,30,0xFFFF0000); // sScreenLog->AddTrack(&me->X,ScreenLog::Track::INT,20,50,0xFFFF0000); // sScreenLog->AddTrack(&me->Y,ScreenLog::Track::INT,20,70,0xFFFF0000); while(true) { realCurrTime = GetMSTime(); diff = GetMSTimeDiff(realPrevTime,realCurrTime); Player* me = sObjMgr->Me(); ReadKeyboard(); if(KEY_PRESSED(DIK_F)) me->Fire(); if(KEY_DOWN(DIK_ESCAPE)) break; if(KEY_DOWN(DIK_W)) me->SetYVelocity(-3); if(KEY_DOWN(DIK_S)) me->SetYVelocity(3); if(KEY_DOWN(DIK_A)) { me->SetXVelocity(-3); if(KEY_DOWN(DIK_D)) { new Explosion(me,me->GetX()+4,me->GetY()+(me->GetHeight()/2),19,0,false); } } if(KEY_DOWN(DIK_D)) { me->SetXVelocity(3); if(KEY_DOWN(DIK_A)) { new Explosion(me,me->GetX()+me->GetWidth()-4,me->GetY()+(me->GetHeight()/2),19,0,false); } } /* Oops :< */ //if(KEY_UP(DIK_W) && KEY_UP(DIK_A) && KEY_UP(DIK_S) && KEY_UP(DIK_D)) // { // me->SetXVelocity(0); // me->SetYVelocity(0); // } if(KEY_DOWN(DIK_R)) me->SetPos(30,70); if(KEY_DOWN(DIK_Q)) me->SetAngle(me->GetAngle()+0.1f); if(KEY_DOWN(DIK_E)) me->SetAngle(me->GetAngle()-0.1f); if(KEY_DOWN(DIK_M)) sWorld->PrintMap(); if(KEY_DOWN(DIK_SPACE)) { me->SetXVelocity(0); me->SetYVelocity(0); } sObjMgr->Update(/* diff */); FollowUnit(me); Render(); realPrevTime = realCurrTime; } }
uint32 GetMSTimeDiffToNow(uint32 time) { return GetMSTimeDiff(time, GetMSTime()); }