【问题标题】:Handling mouse input in a Java card game在 Java 纸牌游戏中处理鼠标输入
【发布时间】:2013-01-06 01:44:32
【问题描述】:

我一直在开发 Java 纸牌游戏应用程序,为了学习,我正在尝试正确实现 MVC 架构。目前,我已经为甲板、桌子和所有玩家实现了模型。我还为每个模型创建了查看器类,每个查看器在 JPanel 中显示其各自的模型。然后我有一个 GameViewer 类,它将所有查看器放入一个 JFrame 中。

我的顶级类调用 Main,它创建所有模型和查看器的实例。我现在正在尝试实现控制器,它将使用 ActionListener 类来查找来自用户的按钮点击并相应地修改查看器和模型。我对如何最好地做到这一点感到困惑。

我的游戏设计是非常顺序的,游戏向用户显示一条消息,然后等待用户通过鼠标单击输入,然后继续,等等。因此,我想我会运行实际的在 Main 中的 while 循环中进行游戏,其中每次迭代代表游戏中的一轮,直到游戏结束。

问题是我只对用户在特定时间的某些输入感兴趣。例如,我可能会向用户显示一条消息并告诉他们单击“确定”按钮继续。在这一点上,我不在乎他们是否点击其中一张卡片,因为我只是在寻找点击 OK 按钮。在其他时候,我可能会要求用户选择一张卡片,在这种情况下,我正在等待他们点击一张卡片,而我对点击 OK 按钮不感兴趣。

我想在没有任何形式的轮询的情况下实现这一点,但我不确定执行此操作的最佳方法。如果我等待用户输入,是否使用 wait() 方法让游戏线程进入睡眠状态,直到来自 ActionListener 的事件回调发送通知?

否则,在 Main 中使用顺序代码是不是错误的方法?我应该在 ActionListener 的事件回调中实现所有游戏逻辑吗?

提前致谢。

【问题讨论】:

    标签: java model-view-controller


    【解决方案1】:

    我的顶级类调用 Main,它创建所有模型和查看器的实例。我现在正在尝试实现控制器,它将使用 ActionListener 类来查找来自用户的按钮点击并相应地修改查看器和模型。我对如何最好地做到这一点感到困惑。

    我的游戏设计是非常顺序的,游戏向用户显示一条消息,然后等待用户通过鼠标点击输入,然后继续等。因此,我想我会运行实际的在 Main 中的 while 循环中进行游戏,其中每次迭代代表游戏中的一轮,直到游戏结束。

    这很好,但我要做的是让您的游戏成为一个逐步游戏(我忘记了这个游戏的名称),在游戏循环中,您可以根据之前的状态和用户输入来更改程序的状态.然后让你的程序的行为依赖于状态。要实现这一点,请考虑创建一个枚举来封装程序状态并使用state design pattern 以允许程序根据其状态改变行为。

    问题是我只对用户在特定时间的某些输入感兴趣。例如,我可能会向用户显示一条消息并告诉他们单击“确定”按钮继续。在这一点上,我不在乎他们是否点击其中一张卡片,因为我只是在寻找点击 OK 按钮。在其他时候,我可能会要求用户选择一张卡片,在这种情况下,我正在等待他们点击一张卡片,而我对点击 OK 按钮不感兴趣。

    这就是状态模式大放异彩的地方,因为有了它,您将允许用户点击他想要的任何地方,但您的程序只会根据程序的状态响应某些点击。

    我想在没有任何形式的轮询的情况下实现这一点,但我不确定最好的方法。如果我等待用户输入,是否使用 wait() 方法让游戏线程进入睡眠状态,直到来自 ActionListener 的事件回调发送通知?

    正确——不要进行轮询,不要使用 wait() 或其他任何可能停止程序流程的东西。

    【讨论】:

      【解决方案2】:

      Swing 是一个事件驱动的环境,你无法控制这些事件何时发生,用户可能会点击你程序的某些部分或按下某个键,你真的无法控制。

      Swing 使用单个线程(AKA The Event Dispatching Thread)或 EDT),Swing 用于将事件分派给相关方以及绘制请求。阻止此线程的任何操作都将阻止 EDT 通知您的应用程序事件或绘制请求,这将使您的程序“挂起”

      您不能将 GUI 视为控制台程序之类的东西,其中的输入很容易控制,相反,您需要根据控件的状态以及必要时的对话框来引导用户。

      所以...永远不要创建阻塞 EDT 的循环,或者执行长时间运行或阻塞(例如 IO 操作)阻塞该线程。

      永远不要从除 EDT 之外的任何线程创建或修改任何 UI 组件。

      您可能想通读一遍

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多