Наведение курсора на кнопку XNA

#button #xna

#кнопка #xna

Вопрос:

У меня есть кнопка в моей игре. и я хочу, чтобы она менялась на другое изображение кнопки при наведении на нее курсора мыши и обратно, когда мышь не находится на кнопке.

проблема в том, что когда мышь выходит из области прямоугольника кнопки, она не возвращается к первому изображению

мой код выглядит так :

     public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);

        MouseState mouseState;
        mouseDiBack = false;
        mouseState = Mouse.GetState();

        if (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(backButtonRectangle))
        {
            backButton = backButtonHilite;
        }

        if ((mouseState.LeftButton == ButtonState.Pressed) amp;amp;
            (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(backButtonRectangle)))
        {
            mouseDiBack = true;
        }




    }

    public override void Draw(GameTime gameTime)
    {

        spriteBatch.Draw(ScoreBG, ScoreBGRectangle, Color.White);
        spriteBatch.Draw(backButton, backButtonRectangle, Color.White);


        base.Draw(gameTime);

    }
}
}
  

есть идеи, как мне это сделать …?

Ответ №1:

Довольно простое решение: вы не вернули изображение обратно в случае, когда мышь не наведена.

        if (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(backButtonRectangle))
       {
           backButton = backButtonHilite;
       }
       else
       {
          backButton = originalImage; //whatever your Texture2D object may be called
       }
  

Не ожидайте, что машина узнает, что вы хотите переключиться обратно! Машины глупы! ..Хорошо, это на самом деле потому, что вы переписали значение переменной и не сбросили его.

Ответ №2:

Вы не возвращаете BackButton к тому, что было раньше, когда мышь выходит за пределы области видимости. Взгляните на приведенный ниже код и обратите внимание на добавленный оператор ELSE в вашей функции обновления.

  defaultBackButton = backButton;   //Save the default back button somewhere outside your update function

public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);

        MouseState mouseState;
        mouseDiBack = false;
        mouseState = Mouse.GetState();

        if (new Rectangle(mouseState.X, mouseState.Y, 1,1).Intersects(backButtonRectangle))
        {
            backButton = backButtonHilite;
        }
        else 
        {
            backButton = defaultBackButton;
        }


        if ((mouseState.LeftButton == ButtonState.Pressed) amp;amp; (new Rectangle(mouseState.X, mouseState.Y, 1, 1).Intersects(backButtonRectangle)))
        {
            mouseDiBack = true;
        }
    }
  

Ответ №3:

Как упоминал Джон, вам нужно вернуть исходную текстуру, когда мышь покинет прямоугольник.

 bool mouseOverBackButton = 
    mouseX >= buttonRectangle.Left amp;amp; mouseX <= buttonRectangle.Right amp;amp; 
    mouseY >= buttonRectangle.Top amp;amp; mouseY <= buttonRectangle.Bottom;

backgroundTexture = mouseOverBackButton ? mouseOverTexture: mouseAwayTexture;
mouseDiBack = mouseState.LeftButton == ButtonState.Pressed amp;amp; mouseOverBackButton;