鼠标点击c# XNA

本文关键字:XNA 鼠标 | 更新日期: 2023-09-27 17:51:23

这已经困扰了我一段时间了,所以我们开始吧…我正在制作一款使用XNA框架的2D游戏,部分游戏需要在UI中使用鼠标点击功能。通过使用这些纹理作为按钮,它使另一个窗口弹出更多的功能。现在的问题是,当你创建一个按钮并使用它时,它会打开另一个窗口,里面有更多的按钮。因为这两个按钮在不同的窗口是在相同的位置,一个鼠标点击操作两个按钮,使最后一个按钮的动作立即,而不必点击两次。

真正的问题是我如何使用精灵作为按钮而不是检查位置并检查该位置是否被点击?

提前感谢您的评论

鼠标点击c# XNA

我创建了一个基本的UI框架,上面有Windows控件。窗口是由zOrder堆叠的,每个窗口上的控件也是如此。有一个ScreenManager类更新跟踪鼠标的每一个tick。当它看到一个按钮被单击时,它从上到下遍历窗口堆栈,寻找包含单击坐标的第一个窗口。然后它调用该窗口实例的OnClick子,它对窗口上的控件做同样的事情。每个方法一旦找到包含单击坐标的第一个控件,就会停止遍历控制堆栈。

我的游戏中的每个独特窗口都是基本窗口类的一个子类,它创建子控件实例并以特定的方式布局它们。按钮之类的控件引发一个被单击的事件,窗口子类处理该事件以执行该按钮所需的逻辑。

您可以使用一个状态管理器,其中有适当的UI。

在你的例子中,第一个状态有你的第一个按钮,我们叫它FirstGameState。当你点击它们时,状态机会把你带到另一个状态,我们叫它MenuState。您可以以一种允许您决定谁处理事件和谁不处理事件的方式实现状态管理器。处理单击事件的唯一状态将是标记为这样做的状态。其余部分只绘制和更新视觉内容,但不处理用户事件。

下面是一个例子:

namespace States
{
    class StateManager
    {
        List<GameState> _states = new List<GameState>();
        List<GameState> _statesCopy = new List<GameState>();
        public Game Game                { get; private set; }
        public SpriteBatch SpriteBatch  { get; private set; }
        public StateManager(Game game, SpriteBatch sb)
        {
            Game = game;
            SpriteBatch = sb;
        }
        public void AddState(GameState state)
        {
            _states.Add(state);
        }
        public void RemoveState(GameState state)
        {
            _states.Remove(state);
        }
        public void Update(GameTime gameTime)
        {
            _statesCopy.Clear();
            foreach (GameState state in _states)
                if (state.RequireUpdate)
                    _statesCopy.Add(state);
            foreach (GameState state in _statesCopy)
                if (state.RequireUpdate)
                    state.Update(gameTime);
        }
        public void Draw()
        {
            foreach (GameState state in _states)
                state.Draw();
        }
    }
}