예제 #1
0
        public override InputMessageResult HandleMessage(InputMessage message)
        {
            switch (message.MessageType)
            {
            case InputMessageType.MouseMove:
                if (_isDragging)
                {
                    _dragEndPosition = message.Value.MousePosition;
                    var mouseDelta = (_dragEndPosition - _mousePosition).ToVector2();
                    _orderGeneratorSystem.ActiveGenerator.UpdateDrag(mouseDelta);
                }
                else
                {
                    _mousePosition = message.Value.MousePosition;
                    _orderGeneratorSystem.UpdatePosition(_mousePosition.ToVector2());
                }
                break;

            case InputMessageType.MouseLeftButtonDown:
                if (_orderGeneratorSystem.ActiveGenerator == null)
                {
                    break;
                }

                if (!_orderGeneratorSystem.ActiveGenerator.CanDrag)
                {
                    _orderGeneratorSystem.OnActivate();
                    break;
                }

                _isDragging = true;
                // Copy initial position to drag end position so that delta is 0 if the drag ends immediately
                _dragEndPosition = _mousePosition;

                return(InputMessageResult.Handled);

            case InputMessageType.MouseLeftButtonUp:
                if (_orderGeneratorSystem.ActiveGenerator == null)
                {
                    break;
                }

                if (_isDragging)
                {
                    _orderGeneratorSystem.OnActivate();
                }

                _isDragging = false;

                return(InputMessageResult.Handled);

            case InputMessageType.MouseRightButtonDown:
                _orderGeneratorSystem.OnMove();

                return(InputMessageResult.Handled);
            }

            return(InputMessageResult.NotHandled);
        }
        public override InputMessageResult HandleMessage(InputMessage message)
        {
            switch (message.MessageType)
            {
            case InputMessageType.MouseMove:
                if (_isDragging)
                {
                    _dragEndPosition = message.Value.MousePosition;
                    _orderGeneratorSystem.UpdateDrag(_dragEndPosition.ToVector2());
                }
                else
                {
                    _mousePosition = message.Value.MousePosition;
                    _orderGeneratorSystem.UpdatePosition(_mousePosition.ToVector2());
                }
                break;

            case InputMessageType.MouseLeftButtonDown:
                if (!_orderGeneratorSystem.ActiveGenerator.CanDrag)
                {
                    if (_orderGeneratorSystem.TryActivate(_keyModifiers))
                    {
                        return(InputMessageResult.Handled);
                    }
                    break;
                }
                _isDragging = true;
                // Copy initial position to drag end position so that delta is 0 if the drag ends immediately
                _dragEndPosition = _mousePosition;
                return(InputMessageResult.Handled);

            case InputMessageType.MouseLeftButtonUp:
                if (_isDragging)
                {
                    _orderGeneratorSystem.TryActivate(_keyModifiers);
                    _isDragging = false;
                    return(InputMessageResult.Handled);
                }
                break;

            case InputMessageType.MouseRightButtonDown:
                // TODO: is this desirable if we don't actually deselect the unit, but simply pan the camera?
                _orderGeneratorSystem.CancelOrderGenerator();
                break;

            case InputMessageType.KeyDown:
                if (message.Value.Key == Veldrid.Key.ControlLeft ||
                    message.Value.Key == Veldrid.Key.ControlRight)
                {
                    _keyModifiers |= KeyModifiers.Ctrl;
                    return(InputMessageResult.Handled);
                }
                break;

            case InputMessageType.KeyUp:
                if (message.Value.Key == Veldrid.Key.ControlLeft ||
                    message.Value.Key == Veldrid.Key.ControlRight)
                {
                    _keyModifiers &= ~KeyModifiers.Ctrl;
                    return(InputMessageResult.Handled);
                }
                break;
            }

            return(InputMessageResult.NotHandled);
        }