处理游戏光标,而不是windows光标

时间:2013-04-09 17:35:56

标签: xna xna-4.0

早些时候,我的Windows游标与游戏不协调有问题,并在此问我如何解决这个问题。一位成员建议我隐藏Windows光标并创建一个自定义游戏光标,所以我这样做了。但是,出现了一个新问题。

我的游戏光标通常偏向Windows鼠标的右侧,因此当我想将游戏光标移动到窗口左侧并单击鼠标左键时,会对游戏造成干扰,例如将应用程序在后台带到顶部。

以下是我的意思:http://i.imgur.com/nChwToh.png

正如您所看到的,游戏光标偏移到Windows光标的右侧,如果我使用游戏光标点击窗口左侧的某些内容,则应用程序在后台(在这种情况下为Google Chrome) ),将被带到前面,对游戏造成干扰。

我可以做些什么来使用我的游戏光标而没有任何干扰?

2 个答案:

答案 0 :(得分:0)

我刚尝试将所有内容从课程中移出,全部进入主要的Game类。 这解决了这个问题,但没有给出答案为什么会发生这种情况。

代码完全相同,它只是组织成单独的类。

那么,有谁知道这是为什么? 为什么使用面向对象的编程而不是把游戏类中的所有内容搞砸了我的鼠标协调和东西呢?

答案 1 :(得分:0)

通常情况下,游戏光标中会有一个纹理,例如,[16,16]处的像素就是你“瞄准”的地方(例如十字准线的中心)。你在鼠标中心绘制这个内容的方法是使用Mouse.GetState()来获取位置,然后用“目标”点的“中心”的负数来偏移鼠标纹理的绘制。

所以我们假设我们制作一个自定义鼠标类:

public class GameMouse
{
    public Vector2 Position = Vector2.Zero;
    private Texture2D Texture { get; set; }
    private Vector2 CenterPoint = Vector2.Zero;
    public MouseState State { get; set; }
    public MouseState PreviousState { get; set; }

    //Returns true if left button is pressed (true as long as you hold button)
    public Boolean LeftDown
    {
        get { return State.LeftButton == ButtonState.Pressed; }
    }

    //Returns true if left button has been pressed since last update (only once per click)
    public Boolean LeftPressed
    {
        get { return (State.LeftButton == ButtonState.Pressed) && 
            (PreviousState.LeftButton == ButtonState.Released); }
    }

    //Initialize texture and states.
    public GameMouse(Texture2D texture, Vector2 centerPoint)
    {
        Texture = texture;
        CenterPoint = centerPoint;
        State = Mouse.GetState();

        //Calling Update will set previousstate and update Position.
        Update();
    }

    public void Update()
    {
        PreviousState = State;
        State = Mouse.GetState();
        Position.X = State.X;
        Position.Y = State.Y;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Begin();
        spriteBatch.Draw(Texture, Position - CenterPoint, Color.White);
        spriteBatch.End();
    }
}