-1

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

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

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

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

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

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

提前致谢。

4

2 回答 2

1

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

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

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

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

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

您可能想通读

于 2013-01-06T02:00:40.997 回答
1

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

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

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

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

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

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

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

于 2013-01-06T02:19:47.343 回答