鼠标单击值不会更新

时间:2013-10-17 22:11:13

标签: c# input xna

我正在制作一个简单的点击游戏,只是为了让我的手掌握鼠标输入课程。

所以,我有一个按钮类(它只是猫的随机图片^^)和计数器类(计算我点击的次数),游戏本身将是“Cookie Clicker”类型游戏; D

但是当我从另一个类使用它时,变量不会更新,即使它是公开的,这是我的类:

class catButton
{
    Texture2D buttonTexture;
    Vector2 buttonPosition;
    public Rectangle buttonRectangle;

    public MouseState currentMouseState;
    public MouseState previousMouseState;

    public void Initialize()
    {
        buttonPosition = new Vector2(150, 300);
    }

    public void LoadContent(ContentManager Content)
    {
        buttonTexture = Content.Load<Texture2D>("cat");
        buttonRectangle = new Rectangle((int)buttonPosition.X, (int)buttonPosition.Y, buttonTexture.Width, buttonTexture.Height);    
    }

    public void Update(GameTime gameTime)
    {
        previousMouseState = currentMouseState;
        currentMouseState = Mouse.GetState();  
    }

    public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
    {
            spriteBatch.Draw(buttonTexture, buttonRectangle, Color.White);
    }      
}

和我的柜台:

class catCounter
{
    SpriteFont catfont;
    Vector2 counterPosition;

    catButton button = new catButton();


    public MouseState currentMouseState;
    public MouseState previousMouseState;

    KeyboardState keyState = Keyboard.GetState();

    public float amountOfCats = 0;

    public catCounter()
    {

    }

    public void LoadContent(ContentManager Content)
    {
        counterPosition = new Vector2(205, 155);
        catfont = Content.Load<SpriteFont>("counter");
    }

    public void Update(GameTime gameTime)
    {
        MouseState currentMouseState = Mouse.GetState();

        if (currentMouseState.LeftButton == ButtonState.Pressed && previousMouseState.LeftButton == ButtonState.Released && button.buttonRectangle.Contains(new Point(currentMouseState.X, currentMouseState.Y)))
        {
            amountOfCats++;
        }

        previousMouseState = currentMouseState;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.DrawString(catfont, "Cats: " + amountOfCats, counterPosition, Color.White);
    }
}

我应该在Game1.cs中点击鼠标吗?

如果你必须知道任何事情告诉我,我很快就写下了这个抱歉!

提前致谢!

2 个答案:

答案 0 :(得分:1)

当您从另一个类使用变量时,为什么不更改变量? 您必须正在接近如何错误地收集此变量。

是哪个变量?什么特别的电话会更新它,但没有按预期进行?

我假设您通过首先将catCounter类初始化为Game1.cs文件中的对象并在相关内的此对象上调用Update()Draw()来更新和绘制组件。 Game1.cs中的方法也是如此,但只是在缺少的情况下提及它。

值得注意Update的{​​{1}}方法只是浪费。只需删除其中的两行。它没有任何作用,因为你不能在任何地方重复使用这些鼠标状态。同样在catButton更新中,您将catCounter重新定义为该范围内的局部变量,使currentMouseState毫无价值且未使用。

无论哪种方式,有关XNA组件的一些注意事项。由于您的类当前遵循给定的XNA结构,因此您应该考虑为您的类继承public MouseState currentMouseState

DrawableGameComponent

允许你这样做:

class catCounter: DrawableGameComponent

这将使您不必手动调用Components.Add(new catCounter()); Update()方法,尽管您需要覆盖特定于它的方法(例如Draw()InitializeLoadContentUpdate)。

对不起,当你没有告诉我们问题出在哪里时,我无法理解你的问题在哪里。

答案 1 :(得分:0)

好吧,我认为更好的方法是创建一个名为clicked的变量并将其设置为False

然后:

    public void Update(GameTime gameTime)
    {
        MouseState currentMouseState = Mouse.GetState();

        if (currentMouseState.LeftButton == ButtonState.Pressed)
        {
            if (clicked == False && button.buttonRectangle.Contains(new Point(currentMouseState.X, currentMouseState.Y)))
            {
                amountOfCats++;
                clicked = True;
            }
        }
        else 
        {
            clicked = False
        }

        // Not needed - previousMouseState = currentMouseState;
    }

NB:别忘了点击bool变量。

这样,您可以阻止用户按住鼠标,并且它不依赖于第二个鼠标状态变量。

至于您的代码无效的原因,是因为Mouse.GetState()会自动更新。因此,previousMouseState将始终是当前的鼠标状态。

我希望这会有所帮助。

莫纳