Ejemplo n.º 1
0
        public PixelWindow(PixelSettings settings)
            : base(settings.ScreenWidth,
			settings.ScreenHeight, GraphicsMode.Default, "Pixel",
			settings.Fullscreen ? GameWindowFlags.Fullscreen : 0)
        {
            logger.Info("Initializing Pixel game window");
            this.Settings = settings;

            Keyboard.KeyDown += Keyboard_KeyDown;

            // Open data file
            if (!string.IsNullOrEmpty(Settings.DataFilePath))
            {
                logger.DebugFormat("Opening data file at {0}", Settings.DataFilePath);
                dataWriter = new YAMLOutputStream(Settings.DataFilePath);
            }

            // Calculate number of pixels
            var possiblePixels = settings.Players * PixelSettings.PlayerButtonCount;
            var maxPixels = Settings.MaxSize * Settings.MaxSize;

            if ((maxPixels > 0) && (possiblePixels > maxPixels))
            {
                tiles = Settings.MaxSize;
            }
            else
            {
                tiles = (int)Math.Floor(Math.Sqrt(possiblePixels));
            }

            pixelCount = tiles * tiles;

            // Calculate pixel and board sizes
            CalculateSizesAndLoadFonts();

            // Load textures
            var textureBasePath = Path.Combine(basePath, Path.Combine("etc", "player_images"));
            logger.DebugFormat("Loading textures from {0}", textureBasePath);

            playerTextureIds = Textures.LoadPlayers(textureBasePath, Settings.Players).ToArray();

            // Create pixels
            pixels.AddRange(Enumerable.Range(0, pixelCount)
                .Select(i => new PlayerPixel(i % tiles, i / tiles,
                    GetInitialPixelState()))
            );

            SetupPlayerSort();

            // Output settings and player pixels
            if (dataWriter != null)
            {
                dataWriter.WriteStartDocument();
                dataWriter.WriteHashSingle("Version", PixelSettings.FileVersion);

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Settings");
            dataWriter.WriteHashSingle("Description", Settings.GameDescription);
                dataWriter.WriteHashSingle("Players", Settings.Players);
                dataWriter.WriteHashSingle("Size", string.Format("{0}x{0}", tiles));
                dataWriter.WriteHashSingle("Initial State", Settings.InitialState);
                dataWriter.WriteHashSingle("Player Sort", Settings.PlayerSort);
                dataWriter.WriteEndList();

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Player Pixels");
                dataWriter.WriteComment("x, y, state, player");

                foreach (var pixel in pixels)
                {
                    if (pixel.State == PixelState.Fixed)
                    {
                        dataWriter.WriteText(string.Format("{0}, {1}, Fixed", pixel.TileLeft, pixel.TileTop));
                    }
                    else
                    {
                        dataWriter.WriteText(string.Format("{0}, {1}, {2}, {3}",
                            pixel.TileLeft, pixel.TileTop, pixel.State, pixel.PlayerId));
                    }
                }

                dataWriter.WriteEndList();

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Moves");
                dataWriter.WriteComment("time in milliseconds, player, x, y, On/Off");
            }

            // Connect to input server
            if (Settings.Port > 0)
            {
                try
                {
                    inputClient.Connect(IPAddress.Loopback, Settings.Port);
                    inputClient.Client.BeginReceive(inputBuffer, 0, 2, SocketFlags.None,
                        inputClient_DataReceived, null);
                }
                catch (Exception ex)
                {
                    logger.Error("Failed to connect to input server", ex);
                }
            }

            inputTimer.Start();
        }
Ejemplo n.º 2
0
        public static void Main(string[] args)
        {
            if (!log4net.LogManager.GetRepository().Configured)
            {
                log4net.Config.BasicConfigurator.Configure();
            }

            log4net.ILog logger = log4net.LogManager.GetLogger("Pixel.Program");

            logger.Info("Starting up Pixel");

            var settings = new PixelSettings()
            {
                IsDebugMode  = false,
                ScreenWidth  = DisplayDevice.Default.Width,
                ScreenHeight = DisplayDevice.Default.Height,
                Fullscreen   = false,
                MaxSize      = 0, Players = 0, Port = 0, PlayerSort = PlayerSort.Random
            };

            logger.Debug("Parsing command-line options");

            // Parse command-line options
            bool showHelp = false, doClusterTest = false;

            var options = new OptionSet()
            {
                { "h|?|help", "Show this help message",
                  v => showHelp = !string.IsNullOrEmpty(v) },

                { "debug", "Enable debug mode (random commands can be issued with 'R')",
                  v => settings.IsDebugMode = !string.IsNullOrEmpty(v) },

                { "screen-width=", "Screen width in pixels (default: current)",
                  v => settings.ScreenWidth = Convert.ToInt32(v) },

                { "screen-height=", "Screen heigh in pixels (default: current)",
                  v => settings.ScreenHeight = Convert.ToInt32(v) },

                { "full-screen", "Enables full-screen mode",
                  v => settings.Fullscreen = !string.IsNullOrEmpty(v) },

                { "max-size=", "Maximum number of tiles in a row or column",
                  v => settings.MaxSize = Convert.ToInt32(v) },

                { "players=", "Number of players (required)",
                  v => settings.Players = Convert.ToInt32(v) },

                { "port=", "Network port of input server",
                  v => settings.Port = Convert.ToInt32(v) },

                { "data-file=", "Path to the output data file",
                  v => settings.DataFilePath = v },

                { "player-sort=", "Initial arrangement of players (Random, Clustered, Diffuse)",
                  v => settings.PlayerSort = (PlayerSort)Enum.Parse(typeof(PlayerSort), v) },

                { "initial-state=", "Initial state of pixels (Random, On, Off)",
                  v => settings.InitialState = (InitialState)Enum.Parse(typeof(InitialState), v) },

                { "cluster-test", "Tests the effectiveness of the clustering algorithm",
                  v => doClusterTest = !string.IsNullOrEmpty(v) },

                { "fixed-pixels=", "List of fixed pixels in the format [X1,Y1][X2,Y2]...",
                  v => settings.FixedPixels.AddRange(CLIObject.FromString <FixedPixel>(v, "X", "Y")) },

                { "description=", "Text to display at the top of the screen during gameplay",
                  v => settings.GameDescription = v }
            };

            options.Parse(args);

            if (showHelp)
            {
                options.WriteOptionDescriptions(Console.Out);
                return;
            }

            if (doClusterTest)
            {
                for (int players = 2; players <= settings.Players; players++)
                {
                    var tiles     = (int)Math.Floor(Math.Sqrt(players * PixelSettings.PlayerButtonCount));
                    var testBoard = ClusteredBoard.Create(players, tiles);

                    logger.InfoFormat("{0} player(s): {1} stragglers", players,
                                      ClusteredBoard.GetStragglerCount(ref testBoard));
                }

                return;
            }

            if (settings.Players < 1)
            {
                logger.Fatal("players option is required");
                return;
            }

            if (settings.IsDebugMode)
            {
                logger.Info("Debug mode is enabled");
            }

            using (var game = new PixelWindow(settings))
            {
                // Start game
                logger.Debug("Running game loop");
                game.Run(0, 0);
            }
        }
Ejemplo n.º 3
0
        public PixelWindow(PixelSettings settings) : base(settings.ScreenWidth,
                                                          settings.ScreenHeight, GraphicsMode.Default, "Pixel",
                                                          settings.Fullscreen ? GameWindowFlags.Fullscreen : 0)
        {
            logger.Info("Initializing Pixel game window");
            this.Settings = settings;

            Keyboard.KeyDown += Keyboard_KeyDown;

            // Open data file
            if (!string.IsNullOrEmpty(Settings.DataFilePath))
            {
                logger.DebugFormat("Opening data file at {0}", Settings.DataFilePath);
                dataWriter = new YAMLOutputStream(Settings.DataFilePath);
            }

            // Calculate number of pixels
            var possiblePixels = settings.Players * PixelSettings.PlayerButtonCount;
            var maxPixels      = Settings.MaxSize * Settings.MaxSize;

            if ((maxPixels > 0) && (possiblePixels > maxPixels))
            {
                tiles = Settings.MaxSize;
            }
            else
            {
                tiles = (int)Math.Floor(Math.Sqrt(possiblePixels));
            }

            pixelCount = tiles * tiles;

            // Calculate pixel and board sizes
            CalculateSizesAndLoadFonts();

            // Load textures
            var textureBasePath = Path.Combine(basePath, Path.Combine("etc", "player_images"));

            logger.DebugFormat("Loading textures from {0}", textureBasePath);

            playerTextureIds = Textures.LoadPlayers(textureBasePath, Settings.Players).ToArray();

            // Create pixels
            pixels.AddRange(Enumerable.Range(0, pixelCount)
                            .Select(i => new PlayerPixel(i % tiles, i / tiles,
                                                         GetInitialPixelState()))
                            );

            SetupPlayerSort();

            // Output settings and player pixels
            if (dataWriter != null)
            {
                dataWriter.WriteStartDocument();
                dataWriter.WriteHashSingle("Version", PixelSettings.FileVersion);

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Settings");
                dataWriter.WriteHashSingle("Description", Settings.GameDescription);
                dataWriter.WriteHashSingle("Players", Settings.Players);
                dataWriter.WriteHashSingle("Size", string.Format("{0}x{0}", tiles));
                dataWriter.WriteHashSingle("Initial State", Settings.InitialState);
                dataWriter.WriteHashSingle("Player Sort", Settings.PlayerSort);
                dataWriter.WriteEndList();

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Player Pixels");
                dataWriter.WriteComment("x, y, state, player");

                foreach (var pixel in pixels)
                {
                    if (pixel.State == PixelState.Fixed)
                    {
                        dataWriter.WriteText(string.Format("{0}, {1}, Fixed", pixel.TileLeft, pixel.TileTop));
                    }
                    else
                    {
                        dataWriter.WriteText(string.Format("{0}, {1}, {2}, {3}",
                                                           pixel.TileLeft, pixel.TileTop, pixel.State, pixel.PlayerId));
                    }
                }

                dataWriter.WriteEndList();

                dataWriter.WriteLine();
                dataWriter.WriteStartList("Moves");
                dataWriter.WriteComment("time in milliseconds, player, x, y, On/Off");
            }

            // Connect to input server
            if (Settings.Port > 0)
            {
                try
                {
                    inputClient.Connect(IPAddress.Loopback, Settings.Port);
                    inputClient.Client.BeginReceive(inputBuffer, 0, 2, SocketFlags.None,
                                                    inputClient_DataReceived, null);
                }
                catch (Exception ex)
                {
                    logger.Error("Failed to connect to input server", ex);
                }
            }

            inputTimer.Start();
        }
Ejemplo n.º 4
0
        public static void Main(string[] args)
        {
            if (!log4net.LogManager.GetRepository().Configured)
            {
                log4net.Config.BasicConfigurator.Configure();
            }

            log4net.ILog logger = log4net.LogManager.GetLogger("Pixel.Program");

            logger.Info("Starting up Pixel");

            var settings = new PixelSettings()
            {
                IsDebugMode = false,
                ScreenWidth = DisplayDevice.Default.Width,
                ScreenHeight = DisplayDevice.Default.Height,
                Fullscreen = false,
                MaxSize = 0, Players = 0, Port = 0, PlayerSort = PlayerSort.Random
            };

            logger.Debug("Parsing command-line options");

            // Parse command-line options
            bool showHelp = false, doClusterTest = false;

            var options = new OptionSet()
            {
                { "h|?|help", "Show this help message",
                    v => showHelp = !string.IsNullOrEmpty(v) },

                { "debug", "Enable debug mode (random commands can be issued with 'R')",
                    v => settings.IsDebugMode = !string.IsNullOrEmpty(v) },

                { "screen-width=", "Screen width in pixels (default: current)",
                    v => settings.ScreenWidth = Convert.ToInt32(v) },

                { "screen-height=", "Screen heigh in pixels (default: current)",
                    v => settings.ScreenHeight = Convert.ToInt32(v) },

                { "full-screen", "Enables full-screen mode",
                    v => settings.Fullscreen = !string.IsNullOrEmpty(v) },

                { "max-size=", "Maximum number of tiles in a row or column",
                    v => settings.MaxSize = Convert.ToInt32(v) },

                { "players=", "Number of players (required)",
                    v => settings.Players = Convert.ToInt32(v) },

                { "port=", "Network port of input server",
                    v => settings.Port = Convert.ToInt32(v) },

                { "data-file=", "Path to the output data file",
                    v => settings.DataFilePath = v },

                { "player-sort=", "Initial arrangement of players (Random, Clustered, Diffuse)",
                    v => settings.PlayerSort = (PlayerSort)Enum.Parse(typeof(PlayerSort), v) },

                { "initial-state=", "Initial state of pixels (Random, On, Off)",
                    v => settings.InitialState = (InitialState)Enum.Parse(typeof(InitialState), v) },

                { "cluster-test", "Tests the effectiveness of the clustering algorithm",
                    v => doClusterTest = !string.IsNullOrEmpty(v) },

                { "fixed-pixels=", "List of fixed pixels in the format [X1,Y1][X2,Y2]...",
                    v => settings.FixedPixels.AddRange(CLIObject.FromString<FixedPixel>(v, "X", "Y")) },

                { "description=", "Text to display at the top of the screen during gameplay",
                    v => settings.GameDescription = v }
            };

            options.Parse(args);

            if (showHelp)
            {
                options.WriteOptionDescriptions(Console.Out);
                return;
            }

            if (doClusterTest)
            {
                for (int players = 2; players <= settings.Players; players++)
                {
                    var tiles = (int)Math.Floor(Math.Sqrt(players * PixelSettings.PlayerButtonCount));
                    var testBoard = ClusteredBoard.Create(players, tiles);

                    logger.InfoFormat("{0} player(s): {1} stragglers", players,
                                      ClusteredBoard.GetStragglerCount(ref testBoard));
                }

                return;
            }

            if (settings.Players < 1)
            {
                logger.Fatal("players option is required");
                return;
            }

            if (settings.IsDebugMode)
            {
                logger.Info("Debug mode is enabled");
            }

            using (var game = new PixelWindow(settings))
            {
                // Start game
                logger.Debug("Running game loop");
                game.Run(0, 0);
            }
        }