コード例 #1
0
        private void UpdateMovementInput(GameTime gt)
        {
            if (!_allowMovementInput)
            {
                Player.Movement.UpdateHeading(Vector3.Zero);
                return;
            }

            var moveVector = Vector3.Zero;
            var now        = DateTime.UtcNow;

            if (Player.CanFly)
            {
                if (InputManager.IsPressed(InputCommand.ToggleCameraFree))
                {
                    Player.IsFlying = !Player.IsFlying;
                }
                else if (InputManager.IsDown(InputCommand.MoveUp) || InputManager.IsDown(InputCommand.Jump))
                {
                    if ((InputManager.IsBeginPress(InputCommand.MoveUp) || InputManager.IsBeginPress(InputCommand.Jump)) &&
                        now.Subtract(_lastUp).TotalMilliseconds <= 125)
                    {
                        Player.IsFlying = !Player.IsFlying;
                    }

                    _lastUp = now;
                }
            }

            //float speedFactor = (float)Player.CalculateMovementSpeed();

            if (InputManager.IsDown(InputCommand.MoveForwards))
            {
                moveVector.Z += 1;
                if (!Player.IsSprinting && Player.CanSprint)
                {
                    if (InputManager.IsBeginPress(InputCommand.MoveForwards) &&
                        now.Subtract(_lastForward).TotalMilliseconds <= 125)
                    {
                        Player.IsSprinting = true;
                    }
                }

                _lastForward = now;
            }
            else
            {
                if (Player.IsSprinting)
                {
                    Player.IsSprinting = false;
                }
            }

            if (InputManager.IsDown(InputCommand.MoveBackwards))
            {
                moveVector.Z -= 1;
            }

            if (InputManager.IsDown(InputCommand.MoveLeft))
            {
                moveVector.X += 1;
            }

            if (InputManager.IsDown(InputCommand.MoveRight))
            {
                moveVector.X -= 1;
            }

            if (Player.IsFlying)
            {
                //speedFactor *= 1f + (float)Player.FlyingSpeed;
                //speedFactor *= 2.5f;

                if (InputManager.IsDown(InputCommand.MoveUp))
                {
                    moveVector.Y += 1;
                }

                if (InputManager.IsDown(InputCommand.MoveDown))
                {
                    moveVector.Y     -= 1;
                    Player.IsSneaking = true;
                }
                else
                {
                    Player.IsSneaking = false;
                }
            }
            else
            {
                if (Player.FeetInWater && InputManager.IsDown(InputCommand.MoveUp))
                {
                    Player.Velocity = new Vector3(Player.Velocity.X, 1f, Player.Velocity.Z);
                }
                else if (!Player.IsInWater && Player.KnownPosition.OnGround && (InputManager.IsDown(InputCommand.Jump) || InputManager.IsDown(InputCommand.MoveUp)))
                {
                    if (Player.Velocity.Y <= 0.00001f && Player.Velocity.Y >= -0.00001f &&
                        Math.Abs(LastVelocity.Y - Player.Velocity.Y) < 0.0001f)
                    {
                        //	moveVector.Y += 42f;
                        //	Player.Velocity += new Vector3(0f, 4.65f, 0f); // //, 0);
                        Player.Jump();
                    }
                }

                if (!Player.IsInWater)                 //Sneaking in water is not a thing.
                {
                    if (InputManager.IsDown(InputCommand.MoveDown) || InputManager.IsDown(InputCommand.Sneak))
                    {
                        Player.IsSneaking = true;
                    }
                    else                     //if (_prevKeyState.IsKeyDown(KeyBinds.Down))
                    {
                        Player.IsSneaking = false;
                    }
                }
            }

            WasInWater = Player.FeetInWater;
            Player.Movement.UpdateHeading(moveVector);

            // LastSpeedFactor = speedFactor;
            if (IgnoreNextUpdate)
            {
                IgnoreNextUpdate = false;
            }
            else
            {
                var checkMouseInput = true;
                if (GamePadInputListener != null && GamePadInputListener.IsConnected)
                {
                    var inputValue = GamePadInputListener.GetCursorPosition();

                    if (inputValue != Vector2.Zero)
                    {
                        checkMouseInput = false;

                        var look = (new Vector2((inputValue.X), (inputValue.Y)) * (float)GamepadSensitivity)
                                   * (float)(gt.ElapsedGameTime.TotalSeconds);

                        look = -look;

                        Player.KnownPosition.HeadYaw -= look.X;
                        Player.KnownPosition.Pitch   -= look.Y;
                        Player.KnownPosition.HeadYaw  = MathUtils.NormDeg(Player.KnownPosition.HeadYaw);
                        Player.KnownPosition.Pitch    = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f);
                    }
                }

                if (checkMouseInput)
                {
                    var e = MouseInputListener.GetCursorPosition();

                    if (e.X < 10 || e.X > Graphics.Viewport.Width - 10 || e.Y < 10 ||
                        e.Y > Graphics.Viewport.Height - 10)
                    {
                        CenterCursor();
                        IgnoreNextUpdate = true;
                    }
                    else
                    {
                        var mouseDelta =
                            _previousMousePosition
                            - e;                             //this.GlobalInputManager.CursorInputListener.GetCursorPositionDelta();

                        var look = (new Vector2((-mouseDelta.X), (mouseDelta.Y)) * (float)CursorSensitivity) * (float)(gt.ElapsedGameTime.TotalSeconds);

                        look = -look;

                        Player.KnownPosition.HeadYaw -= look.X;
                        Player.KnownPosition.Pitch   -= look.Y;
                        Player.KnownPosition.HeadYaw  = MathUtils.NormDeg(Player.KnownPosition.HeadYaw);
                        Player.KnownPosition.Pitch    = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f);

                        //Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch + look.Y, -89.9f, 89.9f);
                        // Player.KnownPosition.Yaw = (Player.KnownPosition.Yaw + look.X) % 360f;
                        // Player.KnownPosition.Yaw %= 360f;
                        _previousMousePosition = e;
                    }
                }
            }

            LastVelocity = Player.Velocity;
        }
コード例 #2
0
        private void UpdateMovementInput(GameTime gt)
        {
            if (!_allowMovementInput)
            {
                return;
            }

            var moveVector = Vector3.Zero;
            var now        = DateTime.UtcNow;

            if (Player.CanFly)
            {
                if (InputManager.IsPressed(InputCommand.ToggleCameraFree))
                {
                    Player.IsFlying = !Player.IsFlying;
                }
                else if (InputManager.IsDown(InputCommand.MoveUp))
                {
                    if (InputManager.IsBeginPress(InputCommand.MoveUp) &&
                        now.Subtract(_lastUp).TotalMilliseconds <= 125)
                    {
                        Player.IsFlying = !Player.IsFlying;
                    }

                    _lastUp = now;
                }
            }

            float modifier = (Player.IsFlying ? (float)Player.FlyingSpeed : (float)Player.MovementSpeed) * 10f;

            if (Player.IsInWater || (WasInWater && Player.AboveWater))
            {
                modifier = 0.3f;
            }
            else if (Player.IsSprinting && !Player.IsSneaking)
            {
                modifier = 1.29997683577f;
                //speedFactor *= 0.2806f;
            }
            else if (Player.IsSneaking && !Player.IsSprinting)
            {
                modifier = 0.29997683576f;
            }

            //	float speedFactor = (((float) Player.MovementSpeed) * modifier);
            float speedFactor = (float)(Player.BaseMovementSpeed * modifier);

            if (InputManager.IsDown(InputCommand.MoveForwards))
            {
                moveVector.Z += 1;
                if (!Player.IsSprinting && Player.CanSprint)
                {
                    if (InputManager.IsBeginPress(InputCommand.MoveForwards) &&
                        now.Subtract(_lastForward).TotalMilliseconds <= 125)
                    {
                        Player.IsSprinting = true;
                    }
                }

                _lastForward = now;
            }
            else
            {
                if (Player.IsSprinting)
                {
                    Player.IsSprinting = false;
                }
            }

            if (InputManager.IsDown(InputCommand.MoveBackwards))
            {
                moveVector.Z -= 1;
            }

            if (InputManager.IsDown(InputCommand.MoveLeft))
            {
                moveVector.X += 1;
            }

            if (InputManager.IsDown(InputCommand.MoveRight))
            {
                moveVector.X -= 1;
            }

            if (Player.IsFlying)
            {
                //speedFactor *= 1f + (float)Player.FlyingSpeed;
                //speedFactor *= 2.5f;

                if (InputManager.IsDown(InputCommand.MoveUp))
                {
                    moveVector.Y += 1;
                }

                if (InputManager.IsDown(InputCommand.MoveDown))
                {
                    moveVector.Y     -= 1;
                    Player.IsSneaking = true;
                }
                else
                {
                    Player.IsSneaking = false;
                }
            }
            else
            {
                if (Player.FeetInWater && InputManager.IsDown(InputCommand.MoveUp))
                {
                    Player.Velocity = new Vector3(Player.Velocity.X, 1f * speedFactor, Player.Velocity.Z);
                }
                else if (!Player.IsInWater && Player.KnownPosition.OnGround && InputManager.IsDown(InputCommand.MoveUp))
                {
                    if (Player.Velocity.Y <= 0.00001f && Player.Velocity.Y >= -0.00001f &&
                        Math.Abs(LastVelocity.Y - Player.Velocity.Y) < 0.0001f)
                    {
                        //	moveVector.Y += 42f;
                        //	Player.Velocity += new Vector3(0f, 4.65f, 0f); // //, 0);
                        Player.Jump();
                    }
                }

                if (!Player.IsInWater)                 //Sneaking in water is not a thing.
                {
                    if (InputManager.IsDown(InputCommand.MoveDown))
                    {
                        Player.IsSneaking = true;
                    }
                    else                     //if (_prevKeyState.IsKeyDown(KeyBinds.Down))
                    {
                        Player.IsSneaking = false;
                    }
                }
            }

            WasInWater = Player.FeetInWater;

            //	if (moveVector != Vector3.Zero)
            {
                var velocity = moveVector * speedFactor;
                velocity = Vector3.Transform(velocity,
                                             Matrix.CreateRotationY(-MathHelper.ToRadians(Player.KnownPosition.HeadYaw)));

                if (Player.IsFlying)
                {
                    if ((Player.Velocity * new Vector3(1, 1, 1)).Length() < velocity.Length())
                    {
                        var old = Player.Velocity;
                        Player.Velocity += new Vector3(velocity.X - old.X, velocity.Y - old.Y, velocity.Z - old.Z);
                    }
                    else
                    {
                        Player.Velocity = new Vector3(velocity.X, velocity.Y, velocity.Z);
                    }
                }
                else
                {
                    var old       = Player.Velocity;
                    var oldLength = (Player.Velocity * new Vector3(1, 0, 1)).Length();
                    if (oldLength < velocity.Length())
                    {
                        Player.Velocity += new Vector3(velocity.X - old.X, 0, velocity.Z - old.Z);
                    }
                    else
                    {
                        Player.Velocity = new Vector3(MathF.Abs(old.X) < 0.0001f ? velocity.X : old.X, Player.Velocity.Y, MathF.Abs(old.Z) < 0.0001f ? velocity.Z : old.Z);
                    }
                }

                //speedFactor *= 20;
                //Player.Velocity += (moveVector * speedFactor);// new Vector3(moveVector.X * speedFactor, moveVector.Y * (speedFactor), moveVector.Z * speedFactor);
            }

            LastSpeedFactor = speedFactor;

            if (IgnoreNextUpdate)
            {
                IgnoreNextUpdate = false;
            }
            else
            {
                var e = this.GlobalInputManager.CursorInputListener.GetCursorPosition();

                var centerX = Graphics.Viewport.Width / 2;
                var centerY = Graphics.Viewport.Height / 2;

                if (e.X < 10 || e.X > Graphics.Viewport.Width - 10 ||
                    e.Y < 10 || e.Y > Graphics.Viewport.Height - 10)
                {
                    _previousMousePosition = new Vector2(centerX, centerY);
                    Mouse.SetPosition(centerX, centerY);
                    IgnoreNextUpdate = true;
                }
                else
                {
                    var mouseDelta = _previousMousePosition - e;                     //this.GlobalInputManager.CursorInputListener.GetCursorPositionDelta();
                    var look       = new Vector2((-mouseDelta.X), (mouseDelta.Y))
                                     * (float)(gt.ElapsedGameTime.TotalSeconds * CursorSensitivity);
                    look = -look;

                    Player.KnownPosition.HeadYaw -= look.X;
                    Player.KnownPosition.Pitch   -= look.Y;
                    Player.KnownPosition.HeadYaw  = MathUtils.NormDeg(Player.KnownPosition.HeadYaw);
                    Player.KnownPosition.Pitch    = MathHelper.Clamp(Player.KnownPosition.Pitch, -89.9f, 89.9f);

                    //Player.KnownPosition.Pitch = MathHelper.Clamp(Player.KnownPosition.Pitch + look.Y, -89.9f, 89.9f);
                    // Player.KnownPosition.Yaw = (Player.KnownPosition.Yaw + look.X) % 360f;
                    // Player.KnownPosition.Yaw %= 360f;
                    _previousMousePosition = e;
                }
            }

            LastVelocity = Player.Velocity;
        }