【问题标题】:Mouse clicks C# XNA鼠标点击 C# XNA
【发布时间】:2015-06-01 21:59:41
【问题描述】:

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

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

提前感谢任何 cmets。

【问题讨论】:

  • 提供最少的代码来重现该问题并解释您迄今为止为解决该问题所做的尝试将非常有帮助。
  • 我是这个网站的新手,所以这里是部分代码。几乎解释了一切。 if (ms.X > sellRect.X + 85 && ms.X sellRect.Y + 25 && ms.Y
  • 我查看了 google / youtube,每个人都使用几乎相同的方法。我只是想知道如何最终解决它:)
  • 看看这个问题。他们的答案是添加一些额外的变量来跟踪应用程序的状态。您可以应用类似的技术。 stackoverflow.com/questions/15733298/…
  • XNA 已停产。使用 Monogame。

标签: c# xna


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以使用状态管理器,其中包含适当的 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多