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(); }
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); } }
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); } }