Exemplo n.º 1
0
        private static void GameFrameLoop(object sender, DoWorkEventArgs e)
        {
            object[]                   parameters           = e.Argument as object[];
            GameController             gameController       = (GameController)parameters[0];
            ServerNetworkingController networkingController = (ServerNetworkingController)parameters[1];

            Stopwatch stopwatch            = new Stopwatch();
            int       millisecondsPerFrame = gameController.GameSettings.MillisecondsPerFrame; // just testing

            while (true)
            {
                // Wait for millisecondsPerFrame
                stopwatch.Start();
                while (stopwatch.ElapsedMilliseconds < millisecondsPerFrame)
                {
                    Thread.Sleep(1);
                }
                stopwatch.Reset();

                // Update the world through the gameController
                lock (gameController) {
                    gameController.UpdateWorld();
                }

                // Send the JSON reperesenting the game world to the clients
                string latestGameWorldJson = gameController.SerializeGameWorld();
                networkingController.SendMessageToEveryClient(latestGameWorldJson);

                // check if cancellation is pending. if so, exit method
                if (e.Cancel)
                {
                    return;
                }
            }
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Server is running...");

            GameController             gameController       = new GameController();
            ServerNetworkingController networkingController = new ServerNetworkingController(gameController);
            DatabaseController         databaseController   = new DatabaseController();

            ServerWebView webViewController  = new ServerWebView(databaseController);
            TcpListener   gameServerListener = networkingController.StartGameServer();
            TcpListener   webViewListener    = webViewController.StartServerWebView();

            // Initialize the world through the gameController
            gameController.InitializeWorld();

            // Spawn frame thread loop
            BackgroundWorker frameLoopThread = new BackgroundWorker();

            frameLoopThread.WorkerSupportsCancellation = true;
            frameLoopThread.DoWork += GameFrameLoop;
            object[] parameters = new object[] { gameController, networkingController };
            frameLoopThread.RunWorkerAsync(parameters);

            Console.WriteLine("Type anything into the console to end the game");
            // Terminate the server when a character is recieved
            Console.ReadLine();

            Console.WriteLine("Game complete");
            // A game is considered completed when the user types anything into the console.
            databaseController.SaveGameToDatabase(gameController.GameWorld, gameController.GameDurationInSeconds);

            // properly shut down the server event loop
            Networking.StopServer(gameServerListener);
            // Clean up our frame loop thread once user prompts to terminate
            frameLoopThread.CancelAsync();

            Console.WriteLine("Web server is still running so you can view game reports.");
            Console.WriteLine("Type anything into the console to shut down the web server");
            Console.ReadLine();
            Console.WriteLine("Killing server");
            Networking.StopServer(webViewListener);
        }