鼠标点击C#XNA

时间:2015-06-01 21:59:42

标签: c# xna

这已经困扰了我很长一段时间所以我们走了...... 我正在使用XNA框架制作2D游戏,部分游戏需要在UI中使用鼠标点击功能。通过使用这些纹理作为按钮,它使另一个窗口弹出更多功能。现在问题是当你创建一个按钮并使用它时,它将打开另一个窗口,其中包含更多按钮。由于不同窗口上的这两个按钮位于同一位置,因此只需单击一下按钮即可操作最后一个按钮,而不必单击两次。

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

提前感谢任何评论。

2 个答案:

答案 0 :(得分:0)

您可以使用状态管理器,其中存在正确的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();
        }
    }
}

答案 1 :(得分:0)

我创建了一个基本的UI框架,其中包含带有控件的Windows。 Windows由zOrder堆叠,每个窗口上的控件也是如此。有一个ScreenManager类可以更新跟踪鼠标的每个刻度。当它看到一个按钮时,它会从上到下走向窗口堆栈,寻找包含点击坐标的第一个窗口。然后它调用该窗口实例的OnClick子,它对窗口上的控件执行相同的操作。一旦找到包含点击坐标的第一个控件,每个方法都会停止走控制堆栈。

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