C#XNA鼠标通过速度移动?

时间:2012-06-25 05:18:35

标签: c# xna mouse

我正在尝试将鼠标对象设置为通过力而不是通过绝对位置。 (虽然它跟踪两者,但是Velocity是我想要更新它的方式。)

但是我遇到了一些问题。

首先,当处于窗口模式时,鼠标不能正常工作。因为一旦它离开屏幕,鼠标就会退出。我尝试使用Mouse.SetPosition每个Update()勾选将其设置为屏幕的中心,将其锁定到窗口。然而,这也会导致问题。

要查看操作中的问题,请在此处编译.sln - > https://github.com/redcodefinal/Clixel

一切都是自动的,所以你需要做的只是编译。 ClxG已经有一个ClxMouse对象。 (ClxG.Mouse)

这是我正在处理的整个Mouse类。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace org.clixel
{
    public class ClxMouse : ClxSprite
    {
        private MouseState _curmouse, _lastmouse;

        private int _scrollwheel;


        public bool LeftDown
        {
            get
            {
                if (_curmouse.LeftButton == ButtonState.Pressed)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public bool RightDown
        {
            get
            {
                if (_curmouse.RightButton == ButtonState.Pressed)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public bool MiddleDown
        {
            get
            {
                if (_curmouse.MiddleButton == ButtonState.Pressed)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public bool LeftPressed
        {
            get
            {
                if (_curmouse.LeftButton == ButtonState.Pressed && _lastmouse.LeftButton == ButtonState.Released)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public bool RightPressed
        {
            get
            {
                if (_curmouse.RightButton == ButtonState.Pressed && _lastmouse.RightButton == ButtonState.Released)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public bool MiddlePressed
        {
            get
            {
                if (_curmouse.MiddleButton == ButtonState.Pressed && _lastmouse.MiddleButton == ButtonState.Released)
                    return true;
                else
                    return false;
            }
            set { }
        }

        public MouseState CurMouse
        {
            get
            {
                return _curmouse;
            }
            set { }
        }

        public MouseState LastMouse
        {
            get
            {
                return _lastmouse;
            }
            set { }
        }

        public ClxMouse()
            : base(ClxAssets.Textures.Cursor)
        {
            _curmouse = Mouse.GetState();
            _lastmouse = _curmouse;
            CollisionBox = new Rectangle(ClxG.Screen.X/2, ClxG.Screen.Y/2, Texture.Width, Texture.Height);
            this.Solid = false;
            Mouse.SetPosition(CollisionBox.X, CollisionBox.Y);
        }

        public ClxMouse(Texture2D _texture)
            : base(_texture)
        {
            _curmouse = Mouse.GetState();
            _lastmouse = _curmouse;
            CollisionBox = new Rectangle(ClxG.Screen.Center.X, ClxG.Screen.Center.Y, Texture.Width, Texture.Height);
        }

        public override void Update()
        {
            _lastmouse = _curmouse;
            _curmouse = Mouse.GetState();

            Velocity = new Vector2(_curmouse.X - _lastmouse.X, _curmouse.Y - _lastmouse.Y);
            Console.WriteLine(Velocity.ToString());
            base.Update();
        }
    }
}

TLDR:如何在不破坏过程中的整个世界的情况下将鼠标锁定到窗口?

我非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以检查每个帧的鼠标是否超出界限。如果是,则需要将其设置为窗口的另一侧。如果鼠标实际上在屏幕外,你将需要在屏幕内创建一些边缘以检查是否超出界限因为它已经太晚了所以如果你有一个800x600的屏幕,你可以使用边距20px(因此鼠标需要保留在一个760x560的盒子中,偏移量为(20,20))并且在某个帧中鼠标位置为(400,567)你知道它超出了界限(0,7)[鼠标位置 - 边距] - >如果x和/或y为正,则需要使用这些值重置鼠标位置。因此在示例中,新的鼠标位置将是(400,27)[27 cuz,每个边缘的边距为20px](x保持不变,因为400-760将小于0)。这样,您可以移动鼠标无限并使用每帧的鼠标位置差来计算速度。