public static bool EvaluateGamepad(GameWindow gw, DPadValues dpad)
        {
            for (int i = 0; i < gw.GamePads.Count(); i++)
            {
                var ipad = gw.GamePads[i].DirectionalPad;

                if (ipad == dpad)
                    return true;

            }
            return false;
        }
        //public static bool isRunningGame { get; set; }
        public static bool EvaluateGamepad(GameWindow gw, string buttonCombo)
        {
            for (int i = 0; i < gw.GamePads.Count(); i++)
            {
                var buttons = gw.GamePads[0].Buttons;

                bool innerPatternFound = true;
                foreach (int j in buttonCombo.Split(',').Select(x => int.Parse(x)))
                {

                    if (!buttons[j])
                    {
                        innerPatternFound = false;
                        break;
                    }

                }

                if (innerPatternFound)
                    return true;

            }
            return false;
        }
        static void Main()
        {
            var settings = Properties.Settings.Default;

            //
            //System.Windows.SystemParameters.PrimaryScreenHeight

            settings.WindowWidth = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
            settings.WindowHeight = (int)System.Windows.SystemParameters.PrimaryScreenHeight;

            var fx = new Font("Fixedsys", 16, FontStyle.Bold);

            var gw = new GameWindow(settings.WindowWidth, settings.WindowHeight);
            var drawRect = new Rectangle(400, 80, settings.WindowWidth - 480, settings.WindowHeight - 120);

            var screens = new List<BaseScreen>();
            screens.Add(new RomLauncher());
            screens.Add(new MenuScreen());

            var drawFont = new Font("Fixedsys", 32, FontStyle.Bold);

            int activeScreenIndex = 0;

            while (gw.IsRunning)
            {
                gw.GamePads.RefreshGamePadEnumeration();

                if (gw.Keyboard[settings.QuitKey] || StateGlobals.EvaluateGamepad(gw, settings.QuitGamepadCombo))
                    break;

                if (gw.Keyboard[settings.CyclePageKey] || StateGlobals.EvaluateGamepad(gw, settings.CyclePageGamepadCombo))
                {
                    activeScreenIndex = (activeScreenIndex + 1) % screens.Count;

                    while (StateGlobals.EvaluateGamepad(gw, settings.CyclePageGamepadCombo)) ;
                }

                gw.Clear(Color.White);
                gw.DrawString(0, 0, "Hot Scramble Game Launcher");

                //if (gw.GamePads.Count() > 0)
                //{

                for(int i = 0; i <gw.GamePads.Count(); i++)
                {
                    gw.DrawString(0, settings.WindowHeight - (fx.Height*i), Color.Black, fx, (string.Format("DPad State : {0}", gw.GamePads[i].DirectionalPad.ToString())).PadRight(30, ' ').Substring(0, 30)
                        + string.Format(" ButtonState: {0}", string.Join("-",
                       Enumerable
                        .Range(0,16).ToList()
                        .Select( b => {
                            if(gw.GamePads[i].Buttons[b])
                                return b.ToString();
                            return "";
                        }))));

                        //gw.GamePads[0].Buttons.SelectMany(b => { if (b) return b.ToString(); return "-"; }))));
                }

                for (int i = 0; i < screens.Count; i++)
                {
                    if (activeScreenIndex == i)
                    {
                        gw.DrawString(40, 80 + (i * drawFont.Height), Color.Red, drawFont, screens[i].Title);
                    }
                    else
                    {
                        gw.DrawString(40, 80 + (i * drawFont.Height), Color.Black, drawFont, screens[i].Title);
                    }
                }

                screens[activeScreenIndex].Draw(drawRect, gw);

                gw.Update();

                if (!screens[activeScreenIndex].Process(gw))
                    break;

            }

            gw.Dispose();
        }
        private static void Main(string[] args)
        {
            using (var w = new GameWindow(800,600))
              {

            w.Mouse.IsVisible = false;

            var imageDict = new Dictionary<GameResourceType, Bitmap>();
            imageDict[GameResourceType.Background] = new Bitmap("..\\Content\\background.png");
            imageDict[GameResourceType.Ball] = new Bitmap("..\\Content\\ball1.png");
            imageDict[GameResourceType.Paddle] = new Bitmap("..\\Content\\paddle.png");
            imageDict[GameResourceType.Brick] = new Bitmap("..\\Content\\brick.png");

            var ballList = new List <Ball>();

            System.Threading.Tasks.Task.Factory.StartNew(
              ()=>{for(int j = 1; j < 100; j++)
            {
              lock(ballList)
              {
                for(int i = 0; i < 150; i++)
                {
                  ballList.Add(new Ball());
                }
              }
              System.Threading.Thread.Sleep(1750);
            }});
            var paddle = new Paddle();

            while (w.IsRunning) {

              paddle.X = w.Mouse.X - 64;

              w.DrawBitmap(imageDict[GameResourceType.Background],0,0);

              w.DrawBitmap(imageDict[GameResourceType.Paddle], (int)paddle.X, (int)paddle.Y);

              lock (ballList)
              {
            foreach (var b in ballList.Where(x => !x.IsDead))
            {

              b.Process(1);
              w.DrawBitmap(imageDict[GameResourceType.Ball], (int)b.X, (int)b.Y);

              if(Rectangle.IsOverlapped(b as Rectangle, paddle as Rectangle)|| Rectangle.IsOverlapped(paddle, b))
              {
                b.Y = paddle.Y-b.H;
                b.VY = -b.VY;
              }

            }
              }
              if(w.Keyboard[System.Windows.Forms.Keys.Escape])
            break;

              w.Update();
            }

              }
        }
 public abstract bool Process(GameWindow gw);
 public abstract void Draw(Rectangle drawRegion, GameWindow gw);