Example #1
0
        private void UpdateButton(XnaInput.ButtonState newState, GamePadButton button)
        {
            var buttonIndex = (int)button;

            states[buttonIndex] =
                states[buttonIndex].UpdateOnNativePressing(newState == XnaInput.ButtonState.Pressed);
        }
        public void UpdateButtonState(MouseButtons button, ButtonState state)
        {
            if (button == MouseButtons.None || ButtonStates[button] == state && !_alwaysNotify) return;

            ButtonStates[button] = state;
            _doNotify = true;
        }
Example #3
0
        internal static void ApplyHandler(CursorInputHandler handler)
        {
            SetPosition(handler.Position);

            if (handler.Left != null)
            {
                MouseLeft = handler.Left.Value;
            }
            if (handler.Right != null)
            {
                MouseRight = handler.Right.Value;
            }
            if (handler.Middle != null)
            {
                MouseMiddle = handler.Middle.Value;
            }
            if (handler.Back != null)
            {
                MouseBack = handler.Back.Value;
            }
            if (handler.Forward != null)
            {
                MouseForward = handler.Forward.Value;
            }
        }
Example #4
0
        internal static void PostProcessButtons()
        {
            if (Player.Playing && ConfigManager.sMouseDisableButtons)
            {
                ResetStatus();
            }
            else
            {
                //handle back/forward buttons on mouse.
                if (GameBase.Instance.IsActive && GameBase.Mode != OsuModes.Edit && GameBase.Mode != OsuModes.Menu)
                {
                    if (MouseBack == ButtonState.Pressed && mouseBackLast != MouseBack)
                    {
                        KeyboardHandler.DoKeyPressed(Microsoft.Xna.Framework.Input.Keys.Escape);
                    }
                    mouseBackLast = MouseBack;

                    if (MouseForward == ButtonState.Pressed && mouseForwardLast != MouseForward)
                    {
                        KeyboardHandler.DoKeyPressed(BindingManager.For(Bindings.Skip));
                    }
                    mouseForwardLast = MouseForward;
                }
            }
        }
Example #5
0
        void MouseViaKeyboardControls()
        {
            leftButton1  |= keyboard.IsKeyDown(ConfigManager.sKeyboardBind1);
            leftButton2  |= keyboard.IsKeyDown(ConfigManager.sKeyboardBind3);
            rightButton1 |= keyboard.IsKeyDown(ConfigManager.sKeyboardBind2);
            rightButton2 |= keyboard.IsKeyDown(ConfigManager.sKeyboardBind4);

            leftButton1i  |= leftButton1 && (!MouseButtonInstantRelease || !keyboardLast.IsKeyDown(ConfigManager.sKeyboardBind1));
            leftButton2i  |= leftButton2 && (!MouseButtonInstantRelease || !keyboardLast.IsKeyDown(ConfigManager.sKeyboardBind3));
            rightButton1i |= rightButton1 && (!MouseButtonInstantRelease || !keyboardLast.IsKeyDown(ConfigManager.sKeyboardBind2));
            rightButton2i |= rightButton2 && (!MouseButtonInstantRelease || !keyboardLast.IsKeyDown(ConfigManager.sKeyboardBind4));

            if ((leftButton2i || leftButton1i) && !ReplayMode && GameBase.Mode == Modes.Play &&
                !(Player.Paused && ChatEngine.IsVisible))
            {
                leftButton = ButtonState.Pressed;
                //MouseHandler.mouseLeft = ButtonState.Pressed;
            }
            if ((rightButton1i || rightButton2i) && !ReplayMode &&
                GameBase.Mode == Modes.Play && !(Player.Paused && ChatEngine.IsVisible))
            {
                rightButton = ButtonState.Pressed;
                //MouseHandler.mouseRight = ButtonState.Pressed;
            }
        }
Example #6
0
        private void MapButtonValue(XNAInput.ButtonState previousXnaButton, XNAInput.ButtonState xnaButton, MappingButtons button)
        {
            // Mapping
            bool isDown     = false;
            bool isPressed  = false;
            bool isReleased = false;

            if (xnaButton == XNAInput.ButtonState.Pressed)
            {
                isDown = true;

                if (previousXnaButton == XNAInput.ButtonState.Released)
                {
                    isPressed = true;
                }
            }
            else if (xnaButton == XNAInput.ButtonState.Released)
            {
                if (previousXnaButton == XNAInput.ButtonState.Pressed)
                {
                    isReleased = true;
                }
            }

            SetMappingValue(button, isDown, isPressed, isReleased);
        }
Example #7
0
 internal static void ResetStatus()
 {
     mouseLeft   = ButtonState.Released;
     _left       = ButtonState.Released;
     mouseRight  = ButtonState.Released;
     _right      = ButtonState.Released;
     mouseMiddle = ButtonState.Released;
     _middle     = ButtonState.Released;
 }
Example #8
0
 private void SetMouseButtonState(MouseButtons button, Microsoft.Xna.Framework.Input.ButtonState state)
 {
     mouse = new MouseState(mouse.X, mouse.Y, mouse.ScrollWheelValue,
                            (button == MouseButtons.Left) ? state : mouse.LeftButton,
                            (button == MouseButtons.Middle) ? state : mouse.MiddleButton,
                            (button == MouseButtons.Right) ? state : mouse.RightButton,
                            (button == MouseButtons.XButton1) ? state : mouse.XButton1,
                            (button == MouseButtons.XButton2) ? state : mouse.XButton2
                            );
     SubmitMouseState();
 }
        private ButtonState AdaptButtonState(Microsoft.Xna.Framework.Input.ButtonState xnaButtonState)
        {
            switch (xnaButtonState)
            {
            case Microsoft.Xna.Framework.Input.ButtonState.Pressed:
                return(ButtonState.PRESSED);

            case Microsoft.Xna.Framework.Input.ButtonState.Released:
            default:
                return(ButtonState.RELEASED);
            }
        }
Example #10
0
        public static bool MenuIspressed()
        {
            Microsoft.Xna.Framework.Input.ButtonState state = Mouse.GetState().LeftButton;
            int mx = Mouse.GetState().X;
            int my = Mouse.GetState().Y;

            if (mx >= _xpos && mx <= _xpos + _xsize && my >= _ypos && my <= _ypos + _ysize)
            {
                return(true);
            }

            return(false);
        }
Example #11
0
        /// <summary>
        /// Updates the active button states from internally set values. If any button has changed, then this returns true.
        /// </summary>
        internal static bool UpdateButtons()
        {
            if (mouseLeft != _left || mouseRight != _right || mouseMiddle != _middle || mouseBack != _back || mouseForward != _forward)
            {
                mouseLeft    = _left;
                mouseRight   = _right;
                mouseMiddle  = _middle;
                mouseBack    = _back;
                mouseForward = _forward;

                return(true);
            }

            return(false);
        }
Example #12
0
        public void ProcessButtons(ButtonState mouseButtonState, Point cursorPoint)
        {
            foreach (var button in Elements)
                if (Utils.CursorInArea(cursorPoint, button.GetBounds()))
                {
                    if (mouseButtonState == ButtonState.Pressed && !MouseButtonToRelease)
                    {
                        button.DoClick();
                        MouseButtonToRelease = true;
                    }
                    else if (mouseButtonState == ButtonState.Released)
                        MouseButtonToRelease = false;

                    button.PerformAction("mouseover", new List<object>{ true });
                }
                else button.PerformAction("mouseover", new List<object> { false });
        }
Example #13
0
        public bool ShowCityMenu()
        {
            Microsoft.Xna.Framework.Input.ButtonState state = Mouse.GetState().LeftButton;
            if (state == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
            {
                int mx = Mouse.GetState().X;
                int my = Mouse.GetState().Y;

                //cancel is 27 pix right corner / substract
                int rangex1 = _xpos + _width;
                int rangey  = _ypos;
                if (mx <= rangex1 && mx >= rangex1 - _cancelsize && my <= rangey + _cancelsize && my >= rangey)
                {
                    return(false);
                }
            }
            return(true);
        }
Example #14
0
        private static bool GetMouseButtonInState(MouseState state, int button, ButtonState buttonState)
        {
            var inState = false;

            switch ((MouseButton)button)
            {
            case MouseButton.Left:
                inState = state.LeftButton == buttonState;
                break;

            case MouseButton.Right:
                inState = state.RightButton == buttonState;
                break;

            case MouseButton.Middle:
                inState = state.MiddleButton == buttonState;
                break;
            }
            return(inState);
        }
Example #15
0
        protected override void Update(GameTime gameTime)
        {
            updateGamePadState();

            // Check for enable/disable
            if (currentGamePadState.Buttons.Start == ButtonState.Pressed && currentGamePadState.Buttons.Back == ButtonState.Pressed &&
                currentGamePadState.Buttons.LeftShoulder == ButtonState.Pressed && currentGamePadState.Buttons.RightShoulder == ButtonState.Pressed)
            {
                if (previousGamePadState.Buttons.Start == ButtonState.Released || previousGamePadState.Buttons.Back == ButtonState.Released ||
                    previousGamePadState.Buttons.LeftShoulder == ButtonState.Released || previousGamePadState.Buttons.RightShoulder == ButtonState.Released)
                {
                    inputDisabled = !inputDisabled;
                }
            }

            if (!inputDisabled)
            {
                // Apply cursor translation
                int cursorTranslateX = (int)(gameTime.ElapsedGameTime.Milliseconds * currentGamePadState.ThumbSticks.Left.X);
                int cursorTranslateY = (int)(gameTime.ElapsedGameTime.Milliseconds * currentGamePadState.ThumbSticks.Left.Y * -1);
                inputSim.Mouse.MoveMouseBy(cursorTranslateX, cursorTranslateY);

                // Simulate LMB-click if A is pressed
                if (currentGamePadState.Buttons.A == ButtonState.Pressed && previousGamePadState.Buttons.A == ButtonState.Released)
                {
                    inputSim.Mouse.LeftButtonDown();
                }
                else if (currentGamePadState.Buttons.A == ButtonState.Released && previousGamePadState.Buttons.A == ButtonState.Pressed)
                {
                    inputSim.Mouse.LeftButtonUp();
                }

                // Simulate RMB-click if X is pressed
                if (currentGamePadState.Buttons.X == ButtonState.Pressed && previousGamePadState.Buttons.X == ButtonState.Released)
                {
                    inputSim.Mouse.RightButtonDown();
                }
                else if (currentGamePadState.Buttons.X == ButtonState.Released && previousGamePadState.Buttons.X == ButtonState.Pressed)
                {
                    inputSim.Mouse.RightButtonUp();
                }

                // Simulate arrow keys for the d-pad
                ButtonState[] currentDirectionState = new ButtonState[4] {
                    currentGamePadState.DPad.Up, currentGamePadState.DPad.Down,
                    currentGamePadState.DPad.Left, currentGamePadState.DPad.Right
                };
                ButtonState[] previousDirectionState = new ButtonState[4] {
                    previousGamePadState.DPad.Up, previousGamePadState.DPad.Down,
                    previousGamePadState.DPad.Left, previousGamePadState.DPad.Right
                };
                for (int dir = 0; dir < 4; dir++)
                {
                    if (currentDirectionState[dir] == ButtonState.Pressed)
                    {
                        if (previousDirectionState[dir] == ButtonState.Released)
                        {
                            inputSim.Keyboard.KeyPress(keycode[dir]);
                            lastRepeatTime[dir] = gameTime.TotalGameTime.TotalMilliseconds;
                        }
                        else
                        {
                            if (!repeating[dir])
                            {
                                if (gameTime.TotalGameTime.TotalMilliseconds - lastRepeatTime[dir] > 500)
                                {
                                    inputSim.Keyboard.KeyPress(keycode[dir]);
                                    lastRepeatTime[dir] = gameTime.TotalGameTime.TotalMilliseconds;
                                    repeating[dir]      = true;
                                }
                            }
                            else
                            {
                                if (gameTime.TotalGameTime.TotalMilliseconds - lastRepeatTime[dir] > 50)
                                {
                                    inputSim.Keyboard.KeyPress(keycode[dir]);
                                    lastRepeatTime[dir] = gameTime.TotalGameTime.TotalMilliseconds;
                                }
                            }
                        }
                    }
                    else
                    {
                        repeating[dir] = false;
                    }
                }

                // Simulate alt tab for the left trigger
                if (currentGamePadState.Triggers.Left > 0.5 && previousGamePadState.Triggers.Left <= 0.5)
                {
                    inputSim.Keyboard.KeyDown(VirtualKeyCode.MENU);
                    inputSim.Keyboard.KeyPress(VirtualKeyCode.TAB);
                }
                else if (currentGamePadState.Triggers.Left <= 0.5 && previousGamePadState.Triggers.Left > 0.5)
                {
                    inputSim.Keyboard.KeyUp(VirtualKeyCode.MENU);
                }

                // Simulate scrolling for right thumbstick
                if (currentGamePadState.ThumbSticks.Right.X != 0)
                {
                    if (previousGamePadState.ThumbSticks.Right.X == 0 ||
                        gameTime.TotalGameTime.TotalMilliseconds - lastScrollTimeHorizontal > 200 - 160 * Math.Abs(currentGamePadState.ThumbSticks.Right.X))
                    {
                        inputSim.Mouse.HorizontalScroll(Math.Sign(currentGamePadState.ThumbSticks.Right.X));
                        lastScrollTimeHorizontal = gameTime.TotalGameTime.TotalMilliseconds;
                    }
                }
                if (currentGamePadState.ThumbSticks.Right.Y != 0)
                {
                    if (previousGamePadState.ThumbSticks.Right.Y == 0 ||
                        gameTime.TotalGameTime.TotalMilliseconds - lastScrollTimeVertical > 200 - 160 * Math.Abs(currentGamePadState.ThumbSticks.Right.Y))
                    {
                        inputSim.Mouse.VerticalScroll(Math.Sign(currentGamePadState.ThumbSticks.Right.Y));
                        lastScrollTimeVertical = gameTime.TotalGameTime.TotalMilliseconds;
                    }
                }
            }

            base.Update(gameTime);
        }
Example #16
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit

            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            stage1.Update(mouseState, keyState, gameTime);
            stage2.Update(mouseState, keyState, gameTime);

            keyState = Keyboard.GetState();
            mouseState = Mouse.GetState();
            menu.Update(gameTime, this, keyState, mouseState);

            keyOState = keyState;
            Camerascroll.Update(gameTime, Player.staticHitbox);

            // Particle modification
            particleComponent.particleEmitterList[0].Position = new Vector2((float)mouseState.X, (float)mouseState.Y);

            if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed && lastButtonState != Microsoft.Xna.Framework.Input.ButtonState.Pressed)
            {
                particleComponent.particleEmitterList[0].Active = !particleComponent.particleEmitterList[0].Active;
            }
            lastButtonState = mouseState.LeftButton;

            Emitter t2 = particleComponent.particleEmitterList[1];
            t2.Position = new Vector2((float)random.NextDouble() * (graphics.GraphicsDevice.Viewport.Width), 0);
            if (t2.EmittedNewParticle)
            {
                float f = MathHelper.ToRadians(t2.LastEmittedParticle.Direction + 180);
                t2.LastEmittedParticle.Rotation = f;
            }

            base.Update(gameTime);
        }
Example #17
0
        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            _spriteBatch.Begin();

            if (_intro.Showintro)
            {
                _intro.DrawIntro(_spriteBatch);
            }
            else
            {
                _spriteBatch.Draw(_textures[CONSTANTS.TXT_YEAR_MENU], new Vector2(0, 0), Color.White);
                _spriteBatch.DrawString(_status.Font, "Year:" + _round.ToString(), new Vector2(10, 15), Color.Red);

                DrawMap(gameTime);


                if (_showcityMenu && _activeCity != null)
                {
                    _cityMenu.DrawCityMenu(_spriteBatch, _activeCity);
                    _showcityMenu = _cityMenu.ShowCityMenu();
                }



                Microsoft.Xna.Framework.Input.ButtonState state = Mouse.GetState().RightButton;
                if (state == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                {
                    MapPosition pos = _mouse.GetMouseMapPosition(_status);
                    if (pos != null)
                    {
                        this.Window.Title = "Pressed" + pos.TID + "POS X" + pos.XPos + ".POS Y" + pos.YPos;

                        City cit = _cities.Find(o => o.MapPosition.XPos == pos.XPos && o.MapPosition.YPos == pos.YPos);
                        if (cit != null)
                        {
                            this.Window.Title = cit.Name;
                            _activeCity       = cit;
                            _showcityMenu     = true;
                        }
                    }
                }

                state = Mouse.GetState().LeftButton;

                if (state == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                {
                    if (Menu.MenuIspressed() == true && !_counterprotect)
                    {
                        //todo Protect Counting up with - mouse State Year Combination
                        _round++;
                        _counterprotect = true;
                    }
                }


                //prevent Years from Counting UP
                if (state == Microsoft.Xna.Framework.Input.ButtonState.Released)
                {
                    _counterprotect = false;
                }


                _mouse.DrawTheMouse(_spriteBatch, GraphicsDevice, _status);
            }

            _spriteBatch.End();
        }
Example #18
0
 public void ActivateMouseEvent(int mx, int my, ButtonState state, MouseButtons button)
 {
     //foreach (IGUIMapper mapper in mappers)
     //    mapper.MouseEventHandler(mx, my, state, button);
 }
Example #19
0
 private void CheckBox_MouseClick(object sender, Vector2 location, MouseButtons button, Microsoft.Xna.Framework.Input.ButtonState state)
 {
     if (button == MouseButtons.Left && state == ButtonState.Released)
     {
         Checked = !@checked;
     }
 }
        //any controls other than pan and zoom
        private void HandleInput()
        {
            if (MainForm.ApplicationIsActivated())
            {
                MouseState mouseState = Mouse.GetState();
                //DETECT MOUSE UP AND DOWN
                rMouseDown = false;
                rMouseUp   = false;
                lMouseDown = false;
                lMouseUp   = false;

                bool spaceDown = false;
                bool delDown   = false;
                bool dDown     = false;


                #region button up/down checks;

                if (kbState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.D) &&
                    oldKbState.IsKeyUp(Microsoft.Xna.Framework.Input.Keys.D))
                {
                    dDown = true;
                }
                else
                {
                    dDown = false;
                }

                if (kbState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Space) &&
                    oldKbState.IsKeyUp(Microsoft.Xna.Framework.Input.Keys.Space))
                {
                    spaceDown = true;
                }
                else
                {
                    spaceDown = false;
                }

                if (kbState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Delete) &&
                    oldKbState.IsKeyUp(Microsoft.Xna.Framework.Input.Keys.Delete))
                {
                    delDown = true;
                }
                else
                {
                    delDown = false;
                }

                if (lastRMouse != mouseState.RightButton)
                {
                    if (lastRMouse == Microsoft.Xna.Framework.Input.ButtonState.Released)
                    {
                        rMouseDown = true;
                    }
                    if (lastRMouse == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                    {
                        rMouseUp = true;
                    }
                }

                if (lastLMouse != mouseState.LeftButton)
                {
                    if (lastLMouse == Microsoft.Xna.Framework.Input.ButtonState.Released)
                    {
                        lMouseDown = true;
                    }
                    if (lastLMouse == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                    {
                        lMouseUp = true;
                    }
                }
                #endregion

                #region mouse input handling

                if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) //if mouse position is over the control
                {
                    if (!this.Focused && mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                    {
                        this.Focus(); //if not in focus, and left click is on control: give controlfocus
                    }
                    else //control is in focus
                    {
                        if (delDown)
                        {
                            parentForm.DeleteSelected();
                        }

                        if (parentForm.selectedToolTreeNode.Index == 0)//led is selected
                        {
                            #region ledMode

                            if (lMouseDown)
                            {
                                AddNewMasses(new Vector2(GetMousePos().X, GetMousePos().Y));
                            }

                            #endregion
                        }

                        else if (parentForm.selectedToolTreeNode.Index == 1) //select is selected
                        {
                            #region selectMode

                            bool offMass = false;
                            if (lMouseDown && selectedMass != null)
                            {
                                foreach (SimString massString in stringLists)
                                {
                                    foreach (SimMass mass in massString.MassList)
                                    {
                                        if (!(GetMousePos().X > mass.CurrPositionX - (massTexture.Width / 2) - 5f &&
                                              GetMousePos().X < mass.CurrPositionX + (massTexture.Width / 2) + 5f &&
                                              GetMousePos().Y > mass.CurrPositionY - (massTexture.Height / 2) - 5f &&
                                              GetMousePos().Y < mass.CurrPositionY + (massTexture.Height / 2) + 5f))          // deteect of mouse down over a mass
                                        {
                                            offMass = true;
                                        }
                                    }
                                }
                                if (offMass) //click was not on a mass
                                {
                                    if (selectedMass.SimObjectType == SimObjectType.PASSIVETEMP)
                                    {
                                        selectedMass.SimObjectType = SimObjectType.ACTIVE;
                                    }
                                    ClearSelection();
                                    offMass = false;
                                }
                            }

                            if (lMouseDown && selectedMass == null)
                            {
                                SimMass   newMass   = null;
                                SimString newString = null;
                                foreach (SimString massString in stringLists)
                                {
                                    foreach (SimMass mass in massString.MassList)
                                    {
                                        if (GetMousePos().X > mass.CurrPositionX - (massTexture.Width / 2) - 5f &&
                                            GetMousePos().X < mass.CurrPositionX + (massTexture.Width / 2) + 5f &&
                                            GetMousePos().Y > mass.CurrPositionY - (massTexture.Height / 2) - 5f &&
                                            GetMousePos().Y < mass.CurrPositionY + (massTexture.Height / 2) + 5f)            // deteect of mouse down over a mass
                                        {
                                            //mouse click was on a mass
                                            newMass   = mass;
                                            newString = massString;
                                        }
                                    }
                                }


                                if (newMass != null && newString != null)
                                {
                                    MakeSelection(newMass, newString);
                                }
                            }


                            if (dDown)
                            {
                                if (selectedMass != null)
                                {
                                    if (selectedMass.SimObjectType == SimObjectType.PASSIVETEMP)
                                    {
                                        selectedMass.SimObjectType = SimObjectType.ACTIVE;
                                    }
                                }
                                ClearSelection();

                                parentForm.saveState();
                            }

                            if ((spaceDown || rMouseDown) && selectedMass != null)
                            {
                                if (selectedMass.SimObjectType == SimObjectType.PASSIVETEMP) //toggle (temp)passive/active
                                {
                                    selectedMass.SimObjectType = SimObjectType.PASSIVE;
                                }
                                else
                                {
                                    selectedMass.SimObjectType = SimObjectType.PASSIVETEMP;
                                }

                                parentForm.saveState();
                            }


                            if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                            {
                                if (selectedMass != null) //if left mouse held and mass is selected, mass is being moved
                                {
                                    selectedMass.CurrPosition = GetMousePos();

                                    if (selectedMass.SimObjectType == SimObjectType.ACTIVE)
                                    {
                                        selectedMass.SimObjectType = SimObjectType.PASSIVETEMP;
                                    }
                                }
                            }
                            #endregion
                        }

                        else if (parentForm.selectedToolTreeNode.Index == 2) //rectangle select is selected
                        {
                            #region rectSelectMode

                            if (lMouseDown)
                            {
                                startVector = new Vector2(this.PointToClient(Control.MousePosition).X, this.PointToClient(Control.MousePosition).Y);
                            }

                            if (mouseState.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                            {
                                Vector2 endVector  = new Vector2(this.PointToClient(Control.MousePosition).X, this.PointToClient(Control.MousePosition).Y);
                                int     rectWidth  = (int)(this.PointToClient(Control.MousePosition).X - startVector.X);
                                int     rectHeight = (int)(this.PointToClient(Control.MousePosition).Y - startVector.Y);

                                Vector2 startVectorTrans = TransformPos(startVector);
                                Vector2 endVectorTrans   = TransformPos(endVector);
                                Vector2 rectVector;
                                if (endVectorTrans.Length() > startVectorTrans.Length())
                                {
                                    rectVector = endVectorTrans - startVectorTrans;
                                }
                                else
                                {
                                    rectVector = startVectorTrans - endVectorTrans;
                                }

                                selectionRectangle = new Rectangle((int)startVectorTrans.X, (int)startVectorTrans.Y, (int)rectVector.X, (int)rectVector.Y);
                                spriteBatch.Begin();

                                spriteBatch.DrawRectangle(new Rectangle((int)startVector.X, (int)startVector.Y, rectWidth, rectHeight), Color.Black);

                                spriteBatch.End();
                            }

                            if (lMouseUp)
                            {
                                //check if any masses are inside rectangle
                                ObjectGroup currentGroup = new ObjectGroup();
                                foreach (SimString massString in stringLists)
                                {
                                    foreach (SimMass mass in massString.MassList)
                                    {
                                        if (selectionRectangle.Contains(new Point((int)mass.CurrPositionX, (int)mass.CurrPositionY)))
                                        {
                                            mass.Selected = true;
                                            foreach (SimMass sMass in massString.MassList)
                                            {
                                                sMass.Selected = true;
                                            }
                                        }
                                    }
                                }
                            }

                            if (dDown)
                            {
                                foreach (SimString massString in stringLists)
                                {
                                    foreach (SimMass mass in massString.MassList)
                                    {
                                        mass.Selected = false;
                                    }
                                }
                            }

                            if (spaceDown || rMouseDown)
                            {
                                foreach (SimString massString in stringLists)
                                {
                                    foreach (SimMass mass in massString.MassList)
                                    {
                                        if (mass.Selected)
                                        {
                                            if (mass.SimObjectType == SimObjectType.ACTIVE || mass.SimObjectType == SimObjectType.PASSIVETEMP)
                                            {
                                                mass.SimObjectType = SimObjectType.GROUPPASSIVE;
                                            }
                                            else if (mass.SimObjectType == SimObjectType.GROUPPASSIVE)
                                            {
                                                mass.SimObjectType = SimObjectType.ACTIVE;
                                            }
                                        }
                                    }
                                }
                            }
                            #endregion
                        }
                    }
                }
                #endregion

                oldKbState = kbState;
                lastLMouse = mouseState.LeftButton;
                lastRMouse = mouseState.RightButton;
                spaceDown  = false;
            }
        }
        protected override void Initialize()
        {
            this.Dock = DockStyle.Fill;

            //Init camera and dimensions
            this.worldDimensions = new Rectangle(0, 0, this.Width, this.Height);
            previousScroll       = Mouse.GetState().ScrollWheelValue;
            zoomIncrement        = 0.01f;
            camera = new Camera(GraphicsDevice.Viewport, (int)worldDimensions.Width * worldSizeMultiplier, (int)worldDimensions.Height * worldSizeMultiplier, 1f);

            numOfMasses = 80;

            ContentManager content = new ContentManager(Services);

            content.RootDirectory = "Content";
            massTexture           = content.Load <Texture2D>("Image1");
            selectedTexture       = content.Load <Texture2D>("selectedRing");
            spriteBatch           = new SpriteBatch(GraphicsDevice);
            selectedMass          = null;

            lastLMouse = Microsoft.Xna.Framework.Input.ButtonState.Released;
            lastRMouse = Microsoft.Xna.Framework.Input.ButtonState.Released;

            //area selection
            startVector = new Vector2();

            //group list
            objectGroupList = new List <ObjectGroup>();


            // Start the animation timer.
            timer          = new Timer();
            timer.Interval = 1;
            timer.Tick    += Tick;
            timer.Start();

            //create simulation
            springSim               = new Simulation(this);
            springSim.Stiffness     = stiffness;
            springSim.Damping       = damping;
            springSim.Length        = 10f;
            springSim.MassPerString = numOfMasses;
            stringLists             = new List <SimString>();

            //add forces
            gravity = new Gravity(new Vector2(0f, 9.81f));
            springSim.AddGlobalForceGenerator(gravity);

            air = new Medium(0.5f);
            springSim.AddGlobalForceGenerator(air);

            barrier = new ControlSide(new Rectangle(worldDimensions.X, worldDimensions.Y,
                                                    worldDimensions.Width * worldSizeMultiplier, worldDimensions.Height * worldSizeMultiplier));
            springSim.AddGlobalForceGenerator(barrier);

            //add integrator
            integrator           = new ForwardEulerIntegrator(this);
            springSim.Integrator = integrator;

            parentForm.saveState();
        }
Example #22
0
        internal static void UpdateFrame()
        {
            if (GameBase.MenuActive)
            {
                return;
            }

            MouseHandler.UpdateWindowsMouse();

            if (doubleClickTime > 0)
            {
                doubleClickTime = (int)Math.Max(0, doubleClickTime - GameBase.ElapsedMilliseconds);
            }

            //Initialises the current input/processing loop frame.  In the case of 2x replays, up to two frames may be processed in a single game tick.
            int loopFrame = 0;

            if (ConfigManager.sMouseSpeed != 1 && GameBase.Mode != Modes.Edit)
            {
                //Handle mouse velocity setting.

                MouseState newState = Mouse.GetState();

                if (Game.IsActive && newState.X >= 0 && newState.X < GameBase.WindowWidth && newState.Y >= 0 &&
                    newState.Y < GameBase.WindowHeight)
                {
#if newmouse
                    Vector2 newMouseVelocityFloat = new Vector2((float)(mouseVelocityFloat.X + (newState.X - mouseVelocityFloat.X) * ConfigManager.sMouseSpeed),
                                                                (float)(mouseVelocityFloat.Y + (newState.Y - mouseVelocityFloat.Y) * ConfigManager.sMouseSpeed));

                    if (mouseVelocityPoint.X != newState.X || mouseVelocityPoint.Y != newState.Y)
                    {
                        mouseVelocityFloat = newMouseVelocityFloat;
                        mouseVelocityPoint = new Point((int)Math.Round(mouseVelocityFloat.X),
                                                       (int)Math.Round(mouseVelocityFloat.Y));
                        if (GameBase.WindowRectangle.Contains(mouseVelocityPoint))
                        {
                            Mouse.SetPosition(mouseVelocityPoint.X, mouseVelocityPoint.Y);
                        }
                    }
#else
                    Mouse.SetPosition((int)Math.Round(mouse.X + (newState.X - mouse.X) * ConfigManager.sMouseSpeed),
                                      (int)Math.Round(mouse.Y + (newState.Y - mouse.Y) * ConfigManager.sMouseSpeed));
#endif

                    /*MouseHandler.MousePoint.X += (int)((newState.X - mouse.X) * MouseHandler.mouseSpeed);
                     * MouseHandler.MousePoint.Y += (int)((newState.Y - mouse.Y) * MouseHandler.mouseSpeed);
                     *
                     * if (!Player.Playing && !GameBase.graphics.IsFullScreen && ( MouseHandler.MousePoint.X < 0 || MouseHandler.MousePoint.X >= GameBase.WindowWidth || MouseHandler.MousePoint.Y < 0 || MouseHandler.MousePoint.Y >= GameBase.WindowHeight))
                     *  Mouse.SetPosition(MouseHandler.MousePoint.X, MouseHandler.MousePoint.Y);
                     *
                     * mouse = newState;*/


                    mouse = Mouse.GetState();
                    MouseHandler.MousePosition.X = mouse.X;
                    MouseHandler.MousePosition.Y = mouse.Y;
                    MouseHandler.MousePoint.X    = mouse.X;
                    MouseHandler.MousePoint.Y    = mouse.Y;
                }
                else
                {
                    mouse = newState;
                    MouseHandler.MousePosition.X = mouse.X;
                    MouseHandler.MousePosition.Y = mouse.Y;
                    MouseHandler.MousePoint.X    = mouse.X;
                    MouseHandler.MousePoint.Y    = mouse.Y;
                }
            }
            else
            {
                mouse = Mouse.GetState();
                MouseHandler.MousePosition.X = mouse.X;
                MouseHandler.MousePosition.Y = mouse.Y;
                MouseHandler.MousePoint.X    = mouse.X;
                MouseHandler.MousePoint.Y    = mouse.Y;
            }


            if (!Player.Playing || !ConfigManager.sMouseDisableButtons)
            {
                MouseHandler.mouseLeft = mouse.LeftButton;

                if (TabletHandler.pendingTabletUpdate)
                {
                    //Make sure we accept a tablet click even when it is release in under 16ms.
                    MouseHandler.mouseLeft            = ButtonState.Pressed;
                    TabletHandler.pendingTabletUpdate = false;
                }
                else if (TabletHandler.tabletLeft == ButtonState.Pressed)
                {
                    MouseHandler.mouseLeft = TabletHandler.tabletLeft;
                }

                MouseHandler.mouseRight  = mouse.RightButton;
                MouseHandler.mouseMiddle = mouse.MiddleButton;
                MouseHandler.mouseBack   = mouse.XButton1;


                if (Game.IsActive && GameBase.Mode != Modes.Edit && GameBase.Mode != Modes.Menu)
                {
                    if (MouseHandler.mouseBack == ButtonState.Pressed && MouseHandler.mouseBackLast != MouseHandler.mouseBack)
                    {
                        KeyboardHandler.DoKeyPressed(Keys.Escape);
                    }
                    MouseHandler.mouseBackLast = MouseHandler.mouseBack;
                }
            }
            else
            {
                MouseHandler.mouseLeft  = ButtonState.Released;
                MouseHandler.mouseRight = ButtonState.Released;
            }

            bool runningSlow = false;

            do
            {
                AudioEngine.Update();
                lock (StreamingManager.LockReplayScore)
                {
                    if (ReplayMode && ReplayScore != null && ReplayScore.replay != null)
                    {
                        int count = ReplayScore.replay.Count;
                        if (GameBase.Mode == Modes.Play && Player.currentScore != null &&
                            count > 0 &&
                            ReplayFrame < count - 2 &&
                            (ReplayToEnd || !ReplayStreaming ||
                             ReplayScore.replay[count - 1].time - AudioEngine.Time > 1000))
                        {
                            Buffering = false;

/*                            if (ReplayStreaming && !Player.IsFailed && Player.Paused)
 *                              Buffering = false;
 *                          else
 *                          {*/
                            if (ReplayFrame < count - 2 &&
                                (ReplayScore.replay[ReplayFrame + 1].time <= AudioEngine.Time))
                            // && (Math.Abs(ReplayScore.replay[ReplayFrame + 1].time - AudioEngine.Time) < 10 || AudioEngine.Time - ReplayScore.replay[ReplayFrame + 1].time > 0))
                            {
                                ReplayFrame++;
                                ReplayOk = true;
                            }
                            else
                            {
                                ReplayOk = false;
                            }

                            runningSlow = AudioEngine.Time - ReplayScore.replay[ReplayFrame].time > 16 && ReplayOk;

                            //skip unnecessary frames
                            if (runningSlow)
                            {
                                while (ReplayFrame < count - 2 && !ReplayScore.replay[ReplayFrame].mouseLeft &&
                                       !ReplayScore.replay[ReplayFrame].mouseRight &&
                                       ReplayScore.replay[ReplayFrame + 1].time <= AudioEngine.Time &&
                                       ReplayScore.replay[ReplayFrame].mouseLeft == leftButtonLastBool &&
                                       ReplayScore.replay[ReplayFrame].mouseRight == rightButtonLastBool &&
                                       ReplayScore.replay[ReplayFrame].buttonState == lastButtonState &&
                                       !Player.IsSpinning)
                                {
                                    Console.WriteLine("replay frame {0} skipped!!!!", ReplayFrame);
                                    ReplayFrame++;
                                }
                            }

                            Vector2 pos;

                            if (MouseButtonInstantRelease)
                            {
                                leftButton1i  = false;
                                leftButton2i  = false;
                                rightButton1i = false;
                                rightButton2i = false;
                                leftButton    = ButtonState.Released;
                                rightButton   = ButtonState.Released;
                            }

                            if (ReplayOk &&
                                (ReplayScore.replay[ReplayFrame].mouseLeft ||
                                 ReplayScore.replay[ReplayFrame].mouseRight ||
                                 ReplayScore.replay[ReplayFrame].buttonState != lastButtonState ||
                                 Player.IsSpinning))
                            {
                                AudioEngine.Time = ReplayScore.replay[ReplayFrame].time;

                                leftButton1i = (!MouseButtonInstantRelease || !leftButton1) && ReplayScore.replay[ReplayFrame].mouseLeft1;
                                leftButton1  = ReplayScore.replay[ReplayFrame].mouseLeft1;

                                leftButton2i = (!MouseButtonInstantRelease || !leftButton2) && ReplayScore.replay[ReplayFrame].mouseLeft2;
                                leftButton2  = ReplayScore.replay[ReplayFrame].mouseLeft2;

                                rightButton1i = (!MouseButtonInstantRelease || !rightButton1) && ReplayScore.replay[ReplayFrame].mouseRight1;
                                rightButton1  = ReplayScore.replay[ReplayFrame].mouseRight1;

                                rightButton2i = (!MouseButtonInstantRelease || !rightButton2) && ReplayScore.replay[ReplayFrame].mouseRight2;
                                rightButton2  = ReplayScore.replay[ReplayFrame].mouseRight2;

                                leftButton  = leftButton1i || leftButton2i ? ButtonState.Pressed : ButtonState.Released;
                                rightButton = rightButton1i || rightButton2i ? ButtonState.Pressed : ButtonState.Released;

                                pos =
                                    GameBase.GamefieldToDisplay(
                                        new Vector2(ReplayScore.replay[ReplayFrame].mouseX,
                                                    ReplayScore.replay[ReplayFrame].mouseY));
                                // *WindowWidth / ReplayScore.resolution;

                                lastButtonState = ReplayScore.replay[ReplayFrame].buttonState;
                            }
                            else if (ReplayScore.replay[ReplayFrame].time == ReplayScore.replay[ReplayFrame + 1].time)
                            {
                                pos =
                                    GameBase.GamefieldToDisplay(
                                        new Vector2(ReplayScore.replay[ReplayFrame].mouseX,
                                                    ReplayScore.replay[ReplayFrame].mouseY));
                            }
                            else if (ReplayScore.replay[ReplayFrame].time >= AudioEngine.Time)
                            {
                                int p1 = Math.Max(0, ReplayFrame - 1);
                                int p2 = ReplayFrame;

                                pos =
                                    Vector2.Lerp(
                                        GameBase.GamefieldToDisplay(
                                            new Vector2(ReplayScore.replay[p1].mouseX, ReplayScore.replay[p1].mouseY)),
                                        GameBase.GamefieldToDisplay(
                                            new Vector2(ReplayScore.replay[p2].mouseX, ReplayScore.replay[p2].mouseY)),
                                        Math.Max(0,
                                                 (
                                                     1 - (float)(ReplayScore.replay[p2].time - AudioEngine.Time) /
                                                     (ReplayScore.replay[p2].time - ReplayScore.replay[p1].time))));
                                if (!MouseButtonInstantRelease)
                                {
                                    leftButton = ReplayScore.replay[p2].mouseLeft
                                                     ? ButtonState.Pressed
                                                     : ButtonState.Released;
                                    rightButton = ReplayScore.replay[p2].mouseRight
                                                      ? ButtonState.Pressed
                                                      : ButtonState.Released;
                                }
                            }
                            else
                            {
                                int p1 = ReplayFrame;
                                int p2 = Math.Min(count - 1, ReplayFrame + 1);

                                pos =
                                    Vector2.Lerp(
                                        GameBase.GamefieldToDisplay(
                                            new Vector2(ReplayScore.replay[p1].mouseX, ReplayScore.replay[p1].mouseY)),
                                        GameBase.GamefieldToDisplay(
                                            new Vector2(ReplayScore.replay[p2].mouseX, ReplayScore.replay[p2].mouseY)),
                                        Math.Max(0,
                                                 1 - ((float)(ReplayScore.replay[p2].time - AudioEngine.Time) /
                                                      (ReplayScore.replay[p2].time - ReplayScore.replay[p1].time))));
                                if (!MouseButtonInstantRelease)
                                {
                                    leftButton = ReplayScore.replay[p1].mouseLeft
                                                     ? ButtonState.Pressed
                                                     : ButtonState.Released;
                                    rightButton = ReplayScore.replay[p1].mouseRight
                                                      ? ButtonState.Pressed
                                                      : ButtonState.Released;
                                }
                            }

                            CursorPosition = pos;
                            CursorPoint    = new Point((int)CursorPosition.X, (int)CursorPosition.Y);

                            Player.Playing = false;
                        }
                        else if (ReplayStreaming)
                        {
                            Player.Playing = false;

                            if (ReplayToEnd)
                            {
                                if (Player.Paused && !Player.Failed)
                                {
                                    Buffering = false;
                                }

                                if (Player.ReplayBufferText != null && Player.Failed)
                                {
                                    Player.ReplayBufferText.Text = "User Failed";
                                }
                            }
                            else

                            /*if (HitObjectManager.hitObjects != null &&
                             * AudioEngine.Time >= HitObjectManager.hitObjects[0].StartTime - HitObjectManager.PreEmpt)*/
                            {
                                Buffering = true;

                                float percent;

                                if (count == 0)
                                {
                                    percent = 0;
                                }
                                else
                                {
                                    percent =
                                        MathHelper.Clamp(
                                            (float)(ReplayScore.replay[count - 1].time - AudioEngine.Time) / 10, 0, 100);
                                }

                                if (Player.ReplayBufferText != null)
                                {
                                    if (Player.Failed)
                                    {
                                        Player.ReplayBufferText.Text = "Failed";
                                    }
                                    else
                                    {
                                        Player.ReplayBufferText.Text =
                                            string.Format("Buffering {0:0.0}%...", percent);
                                    }
                                }
                            }
                        }
                    }
                }
                if (!ReplayMode)
                {
                    //todo: move this to the outer loop?
                    Player.Playing = GameBase.Mode == Modes.Play &&
                                     AudioEngine.Time >= Player.skipBoundary &&
                                     !Player.Failed && !Player.Paused && !EventManager.BreakMode &&
                                     Game.IsActive && !Player.currentScore.pass;

                    if (Player.Playing && !GameBase.graphics.IsFullScreen)
                    {
                        if (Cursor.Clip == cursorOriginalBounds)
                        {
                            Cursor.Clip = GameBase.Form.RectangleToScreen(GameBase.Form.ClientRectangle);
                        }
                    }
                    else if (Cursor.Clip != cursorOriginalBounds)
                    {
                        Cursor.Clip = cursorOriginalBounds;
                    }

                    CursorPosition = MouseHandler.MousePosition;
                    CursorPoint    = MouseHandler.MousePoint;
                    leftButton     = MouseHandler.mouseLeft;
                    leftButton1i   = leftButton == ButtonState.Pressed && !leftButtonLastBool;
                    leftButton1    = leftButton == ButtonState.Pressed;
                    leftButton2i   = leftButton == ButtonState.Pressed && !leftButtonLastBool;
                    leftButton2    = leftButton == ButtonState.Pressed;

                    rightButton   = MouseHandler.mouseRight;
                    rightButton1i = rightButton == ButtonState.Pressed && !rightButtonLastBool;
                    rightButton1  = rightButton == ButtonState.Pressed;
                    rightButton2i = rightButton == ButtonState.Pressed && !rightButtonLastBool;
                    rightButton2  = rightButton == ButtonState.Pressed;
                }

                //Update mouse cursor position, except in editor mode where we use the windows cursor.
                if (!GameBase.MenuVisible)
                {
                    if (spriteCursor.IsVisible && GameBase.SixtyFramesPerSecondFrame)
                    {
                        pSprite trail =
                            new pSprite(SkinManager.Load("cursortrail"), FieldTypes.WindowScaleOnly,
                                        (SkinManager.Current.CursorCentre ? OriginTypes.Centre : OriginTypes.TopLeft),
                                        ClockTypes.Game, CursorPosition, spriteCursor.Depth - 0.001F,
                                        false,
                                        Color.White);
                        trail.FadeOut(150);
                        trail.CurrentScale = spriteCursor.CurrentScale;
                        if (SkinManager.Current.CursorTrailRotate)
                        {
                            trail.CurrentRotation = spriteCursor.CurrentRotation;
                        }
                        GameBase.spriteManagerOverlay.Add(trail);
                    }

                    spriteCursor.CurrentPosition = CursorPosition;
                }

                //Only do actions on the input if the window is active.
                if (Game.IsActive || ReplayMode)
                {
                    //Mouse wheel
                    MouseHandler.MouseWheelHandled = false;
                    if (mouse.ScrollWheelValue != scrollWheel)
                    {
                        /*if (ChatEngine.IsVisible)
                         * {
                         *  if (mouse.ScrollWheelValue > scrollWheel)
                         *      ChatEngine.MouseHandler_OnMouseWheelUp(null, null);
                         *  else
                         *      ChatEngine.MouseHandler_OnMouseWheelDown(null, null);
                         * }
                         * else
                         * {*/
                        if (mouse.ScrollWheelValue > scrollWheel)
                        {
                            MouseHandler.DoMouseWheelUp();
                        }
                        else
                        {
                            MouseHandler.DoMouseWheelDown();
                        }
                        /*}*/
                        scrollWheel = mouse.ScrollWheelValue;
                    }

                    try
                    {
                        keyboard = Keyboard.GetState();
                    }
                    catch (InvalidOperationException)
                    {
                    }

                    if (!ReplayMode)
                    {
                        MouseViaKeyboardControls();
                    }


                    Keys[] newKeys = (Keys[])keyboard.GetPressedKeys().Clone();

                    if (pressedKeys != null && !keyboard.IsKeyDown(Keys.Scroll))
                    {
                        KeyboardHandler.ControlPressed = (keyboard.IsKeyDown(Keys.LeftControl) ||
                                                          keyboard.IsKeyDown(Keys.RightControl));
                        KeyboardHandler.AltPressed = (keyboard.IsKeyDown(Keys.LeftAlt) ||
                                                      keyboard.IsKeyDown(Keys.RightAlt));
                        KeyboardHandler.ShiftPressed = (keyboard.IsKeyDown(Keys.LeftShift) ||
                                                        keyboard.IsKeyDown(Keys.RightShift));

                        for (int i = 0; i < newKeys.Length; i++)
                        {
                            Keys k      = newKeys[i];
                            bool bFound = false;


                            for (int j = 0; j < pressedKeys.Length; j++)
                            {
                                if (k == pressedKeys[j])
                                {
                                    bFound = true;
                                    break;
                                }
                            }

                            if (!bFound && GameBase.FadeState != FadeStates.FadeOut)
                            {
                                repeatTickCurrent = -100;
                                BanchoClient.Activity();
                                GameBase.KeyboardHandler_OnKeyPressed(null, k);
                                if (ChatEngine.IsVisible)
                                {
                                    string ks = k.ToString();
                                    if (ks.Length == 2 && ks[0] == 'F' && ks[1] >= '0' && ks[1] <= '9')
                                    {
                                        KeyboardHandler.DoKeyPressed(k);
                                    }
                                    else
                                    {
                                        ChatEngine.GameBase_OnKeyRepeat(null, k, true);
                                    }
                                }
                                else if (GameBase.ActiveDialog != null)
                                {
                                    GameBase.ActiveDialog.HandleKey(k);
                                }
                                else if (!thisBlockKey)
                                {
                                    KeyboardHandler.DoKeyPressed(k);
                                }
                            }
                        }
                    }

                    pressedKeys = newKeys;

                    repeatTickCurrent += GameBase.ElapsedMilliseconds;

                    if (repeatTickCurrent >= repeatTickRate)
                    {
                        repeatTickCurrent -= repeatTickRate;

                        if (pressedKeys != null && !keyboard.IsKeyDown(Keys.Scroll))
                        {
                            foreach (Keys k in newKeys)
                            {
                                bool bFound = false;

                                foreach (Keys k2 in pressedKeys)
                                {
                                    if (k == k2)
                                    {
                                        bFound = true;
                                        break;
                                    }
                                }

                                if (ChatEngine.IsVisible)
                                {
                                    ChatEngine.GameBase_OnKeyRepeat(null, k, false);
                                }
                                else if (GameBase.ActiveDialog == null && bFound && GameBase.FadeState == FadeStates.Idle &&
                                         !thisBlockKey)
                                {
                                    KeyboardHandler.DoOnKeyRepeat(k);
                                }
                            }
                        }
                        if (leftButton == ButtonState.Pressed &&
                            MouseHandler.MouseDown && GameBase.FadeState != FadeStates.FadeOut)
                        {
                            MouseHandler.DoOnClickRepeat();
                        }
                    }

                    MouseHandler.actualClickRegistered = (MouseHandler.mouseLeft == ButtonState.Pressed &&
                                                          mouseLeftActualPrev != ButtonState.Pressed) || (MouseHandler.mouseRight == ButtonState.Pressed &&
                                                                                                          mouseRightActualPrev != ButtonState.Pressed);

                    if (leftButtonLast != leftButton || rightButtonLast != rightButton)
                    {
                        MouseHandler.LastButton2 = MouseHandler.LastButton;
                        MouseHandler.LastButton  = MouseHandler.MouseDownButton;

                        MouseHandler.MouseDownButton = MouseButtons.None;
                        if (leftButton == ButtonState.Pressed)
                        {
                            MouseHandler.MouseDownButton |= MouseButtons.Left;
                        }
                        if (rightButton == ButtonState.Pressed)
                        {
                            MouseHandler.MouseDownButton |= MouseButtons.Right;
                        }
                    }

                    //We don't have a replay click, so lets check for physical mouse clicks.
                    //In the case that there is a replay and actual click the same frame, doOnClick will be called only once (above).
                    if (MouseHandler.actualClickRegistered && ReplayMode && GameBase.FadeState != FadeStates.FadeOut)
                    {
                        bool old = MouseHandler.gamePressedRegistered;
                        MouseHandler.gamePressedRegistered = false;
                        MouseHandler.DoOnClick();
                        MouseHandler.gamePressedRegistered = old;
                    }

                    leftCond   = leftButton == ButtonState.Pressed && leftButtonLast != leftButton;
                    rightCond  = rightButton == ButtonState.Pressed && rightButtonLast != rightButton;
                    middleCond = MouseHandler.mouseMiddle == ButtonState.Pressed &&
                                 mouseMiddlePrev != MouseHandler.mouseMiddle;

                    MouseHandler.gameClickRegistered = false;

                    if (leftCond || rightCond || middleCond)
                    {
                        if (!middleCond)
                        {
                            if (SkinManager.Current.CursorExpand)
                            {
                                spriteCursor.Transformations.RemoveAll(
                                    delegate(Transformation tr) { return(tr.Type != TransformationType.Rotation); });
                                Transformation t =
                                    new Transformation(TransformationType.Scale, 1, 1.3F, GameBase.Time,
                                                       GameBase.Time + 100);
                                t.Easing = EasingTypes.In;
                                spriteCursor.Transformations.Add(t);
                            }
                            MouseHandler.clickPosition = new Vector2(mouse.X, mouse.Y);

                            MouseHandler.gamePressedRegistered = true;
                            MouseHandler.gameClickRegistered   = true;

                            if (doubleClickTime > 0 && GameBase.FadeState != FadeStates.FadeOut)
                            {
                                MouseHandler.DoOnDoubleClick();
                            }
                        }

                        if (GameBase.FadeState != FadeStates.FadeOut)
                        {
                            MouseHandler.DoOnClick();
                            repeatTickCurrent = 0;
                            doubleClickTime   = 250;
                        }
                    }
                    else if (leftButton == ButtonState.Released &&
                             rightButton == ButtonState.Released &&
                             MouseHandler.gamePressedRegistered)
                    {
                        if (SkinManager.Current.CursorExpand)
                        {
                            spriteCursor.Transformations.RemoveAll(
                                delegate(Transformation tr) { return(tr.Type != TransformationType.Rotation); });
                            Transformation t =
                                new Transformation(TransformationType.Scale, spriteCursor.CurrentScale, 1, GameBase.Time,
                                                   GameBase.Time + 100);
                            t.Easing = EasingTypes.In;
                            spriteCursor.Transformations.Add(t);
                        }
                        MouseHandler.gamePressedRegistered = false;
                        MouseHandler.DoOnClickUp();
                    }

                    if (MouseHandler.mouseLeft == ButtonState.Pressed &&
                        GameBase.FadeState != FadeStates.FadeOut)
                    {
                        MouseHandler.MouseDown = true;
                        if (mouse.X != MouseHandler.clickPosition.X ||
                            mouse.Y != MouseHandler.clickPosition.Y)
                        {
                            MouseHandler.DoOnDrag();
                        }
                    }
                    else
                    {
                        MouseHandler.MouseDown = false;
                        if (IsDragging)
                        {
                            MouseHandler.DoOnEndDrag();
                        }
                    }
                }
                else
                {
                    leftButton  = ButtonState.Released;
                    rightButton = ButtonState.Released;
                }


                GameBase.Instance.UpdateChildren();

                leftButtonLast  = leftButton;
                rightButtonLast = rightButton;

                leftButtonLastBool  = leftButton == ButtonState.Pressed;
                rightButtonLastBool = rightButton == ButtonState.Pressed;

                mouseLeftActualPrev  = MouseHandler.mouseLeft;
                mouseRightActualPrev = MouseHandler.mouseRight;
                mouseMiddlePrev      = MouseHandler.mouseMiddle;

                keyboardLast = keyboard;

                thisBlockKey = false;
            } while (ReplayMode && ((ReplayModeFF && loopFrame++ < 1) || (runningSlow && loopFrame++ < 4)));
        }