コード例 #1
0
ファイル: NetworkDemoGame.cs プロジェクト: rosebud667/Pixel3D
        P2PNetwork CreateNetwork(BadNetworkSimulation badNetworkSimulation)
        {
            var appConfig = new NetworkAppConfig("Rollback Test", new[] { 11101, 11102, 11103, 11104, 11105, 11106 }, 0, null);

            network = new P2PNetwork(appConfig, new SimpleConsoleWriter(console), badNetworkSimulation);
            return(network);
        }
コード例 #2
0
        private static void Main(string[] args)
        {
            Console.Title = "P2P Test";
            const int msPerFrame = 16;

            #region Startup mode select

            Console.WriteLine("Connection Testing Program. Escape to exit.");
            Console.WriteLine();
            Console.WriteLine("[Z] = Toggle bad network simulation");
            Console.WriteLine("[Q] = Add player data");
            Console.WriteLine("[space] = Begin");
            Console.WriteLine();

            var    badNetworkSimPreset = 0;
            byte[] localPlayerData     = null;

            while (true)
            {
                var keyInfo = Console.ReadKey(true);
                var key     = keyInfo.Key;

                if (key == ConsoleKey.Escape)
                {
                    return;
                }

                if (key == ConsoleKey.Spacebar)
                {
                    break;
                }

                if (key == ConsoleKey.Q)
                {
                    if ((keyInfo.Modifiers & ConsoleModifiers.Shift) == 0)
                    {
                        Array.Resize(ref localPlayerData, localPlayerData == null ? 1 : localPlayerData.Length + 1);
                        localPlayerData[localPlayerData.Length - 1] = (byte)(localPlayerData.Length - 1);
                    }
                    else if (localPlayerData != null && localPlayerData.Length > 0)
                    {
                        Array.Resize(ref localPlayerData, localPlayerData.Length - 1);
                    }

                    Console.WriteLine("Player data length = " + localPlayerData.Length);
                }

                if (key == ConsoleKey.Z)
                {
                    badNetworkSimPreset = BadNetworkSimulation.NextPreset(badNetworkSimPreset);
                    Console.WriteLine(BadNetworkSimulation.GetPreset(badNetworkSimPreset).ToString());
                }
            }

            #endregion

            #region Network Game Menu (and LAN Discovery)

            var appConfig = new NetworkAppConfig("P2P Test", new[] { 20001, 20002, 20003, 20004, 20005, 20006 },
                                                 SimpleNetworkGame.ProtocolVersion, null);

            var network = new P2PNetwork(appConfig, new ConsoleLogHandler(),
                                         BadNetworkSimulation.GetPreset(badNetworkSimPreset));
            SimpleNetworkGame networkGame;

            Console.Title = "P2P Test - Port " + network.PortNumber;

            network.StartDiscovery();
            network.Discovery.OnItemsChanged += PrintNetworkMenu;             // Will keep reprinting menu during discovery

            // Print initial menu directly:
            PrintNetworkMenu(network.Discovery);

            while (true)
            {
                // Poll network
                network.Update();

                // Handle Input
                if (Console.KeyAvailable)
                {
                    var keyPress = Console.ReadKey(true);

                    // Exit
                    if (keyPress.Key == ConsoleKey.Escape)
                    {
                        goto Shutdown;
                    }

                    // Select a discovered server
                    if (keyPress.Key >= ConsoleKey.D0 && keyPress.Key <= ConsoleKey.D9)
                    {
                        var selection = keyPress.Key - ConsoleKey.D0;
                        if (selection >= 0 && selection < network.Discovery.Items.Count &&
                            network.Discovery.Items[selection].CanJoin)
                        {
                            var discoveredGame = network.Discovery.Items[selection];
                            network.StopDiscovery();

                            Console.WriteLine();
                            Console.WriteLine("Connecting to game: " + discoveredGame.GameInfo.Name);
                            network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player",
                                                  localPlayerData, discoveredGame.EndPoint, 0, 0);
                            break;
                        }
                    }

                    // Start an Internet or LAN game:
                    var internet = false;
                    if (keyPress.Key == ConsoleKey.F1 || (internet = keyPress.Key == ConsoleKey.F2))
                    {
                        network.StopDiscovery();

                        Console.WriteLine();
                        Console.WriteLine(internet ? "Starting Internet Game..." : "Starting LAN Game...");
                        network.StartGame(networkGame = new SimpleNetworkGame(network), "Player", localPlayerData,
                                          "Default Game", internet, false, 0);
                        break;
                    }

                    // Join a specific game host:
                    if (keyPress.Key == ConsoleKey.F3)
                    {
                        Console.WriteLine();
                        Console.WriteLine("Enter host to connect to:");
                        var userHost = Console.ReadLine();

                        IPEndPoint endpoint = null;
                        try
                        {
                            endpoint = network.ParseAndResolveEndpoint(userHost);
                        }
                        catch
                        {
                        }

                        if (endpoint == null)
                        {
                            Console.WriteLine("Failed to parse or resolve endpoint: \"" + endpoint + "\"");
                        }
                        else
                        {
                            network.StopDiscovery();
                            Console.WriteLine("Connecting to game at " + endpoint);
                            network.ConnectToGame(networkGame = new SimpleNetworkGame(network), "Player",
                                                  localPlayerData, endpoint, 0, 0);
                            break;
                        }
                    }
                }

                Thread.Sleep(msPerFrame);
            }

            #endregion

            #region Run Network

            while (true)
            {
                // Poll network
                network.Update();
                networkGame.Update();

                // Handle Input
                if (Console.KeyAvailable)
                {
                    var keyPress = Console.ReadKey(true);

                    // Exit
                    if (keyPress.Key == ConsoleKey.Escape)
                    {
                        goto Shutdown;
                    }

                    networkGame.HandleKeyPress(keyPress);
                }

                Thread.Sleep(msPerFrame);
            }

            #endregion

            #region Shutdown

Shutdown:
            network.Shutdown().Wait(1500);

            #endregion
        }