Пример #1
0
int main(int argc, char *argv[])
{
	SunState state;
	initialiseState(&state, 51.509865, -0.118092);
	calculateSunriseOn(&state, date(2000, 2, 1));
	calculateSunsetOn(&state, date(2099, 2, 1));
	return 0;
}
Пример #2
0
void runGame(PlayerSet& players, 
             ControlData& control, 
             const GameState& gameState, 
             const Map& map, 
             const SimulationParameters& params,
             GameStats& gameStats,
             zmq::socket_t& stateSocket, 
             const json& settings, 
             InfoLogger& logger)
{
  
  uint targetFPS = settings["simulation"]["targetFPS"];
  uint totalGameTimeSeconds = settings["gameTime"];
  uint integrationSteps = uint(1. / float(targetFPS) / params.timeStep);

  // Make sure the per-game stats are cleared
  gameStats.playerRanks.clear();
  gameStats.playerDists.clear();

  uint nShips = players.fromId.size();
  uint targetMicroseconds = 1000000 / targetFPS;
  StateMatrix state(nShips, STATE_LENGTH);
  initialiseState(state, map, params);
  ControlMatrix inputs = control.inputs;
  bool running = true;
  unsigned int fpscounter = 0;
  
  auto gameStart = hrclock::now();
  logger("game", "status",
        {{"state","running"},{"map",map.name}, {"game",gameState.name}}); 
  while (running && !interruptedBySignal)
  {
    auto frameStart = hrclock::now();

    // Threadsafe copy of control inputs (unlock managed by scope)
    {
      std::lock_guard<std::mutex> lock(control.mutex);
      inputs = control.inputs;
    }

    for (uint i=0; i<integrationSteps;i++)
      rk4TimeStep(state, inputs, params, map);

    // Calculate game stats every second
    fpscounter++;
    if (fpscounter >= targetFPS)
    {
        fpscounter = 0;
        playerScore(state, control, map, params, gameStats);
        logger("game", "status",
            {{"state","running"},{"map",map.name}, {"game",gameState.name},
             {"ranking", gameStats.playerRanks}}); 
    }
    
    //check we don't need to end the game
    bool timeout = hasRoughIntervalPassed(gameStart, totalGameTimeSeconds, targetFPS);
    bool raceWon = winner(players, state,control, map, params) != "";
    running = (!timeout) && (!raceWon);

    // get control inputs from control thread
    broadcastState(players, state, gameState, control, params, stateSocket);

    // make sure we target a particular frame rate
    waitPreciseInterval(frameStart, targetMicroseconds);
  }

  // Game over, so tell the clients
  playerScore(state, control, map, params, gameStats); // get final score
  updateRanks(players, control,map, gameStats);
  logger("game", "status",
         {{"state","finished"},{"map",map.name}, {"game",gameState.name},
          {"ranking", gameStats.playerRanks}, {"totalScore", gameStats.totalPlayerScore},
          {"teamScore", gameStats.totalTeamScore}}); 
  send(stateSocket, {gameState.name,"{\"state\":\"finished\"}"});

}