我一直致力于Java卡游戏应用程序,我正在努力为了学习而正确实现MVC架构。目前,我已经为甲板,桌子和所有玩家实施了模型。我还为每个模型创建了查看器类,其中每个查看器在JPanel中显示其各自的模型。然后我有一个GameViewer类,它将所有观众放入JFrame。
我的顶级类调用Main,它创建所有模型和查看器的实例。我现在正在尝试实现控制器,它将使用ActionListener类来查找用户的按钮点击并相应地修改查看器和模型。关于如何最好地做到这一点我很困惑。
我的游戏设计非常顺序,游戏向用户显示消息,然后等待鼠标点击用户的输入,然后继续等等。因此,我认为我会运行实际在Main中进行一段时间的游戏,其中每次迭代代表游戏中的一轮,直到游戏结束。
问题是我只对特定时间用户的一些输入感兴趣。例如,我可能会向用户显示一条消息,并告诉他们单击“确定”按钮继续。此时,我不在乎他们是否点击了其中一张卡片,因为我只是想点击“确定”按钮。在其他时候,我可能会要求用户选择一张卡片,在这种情况下,我正在等他们点击一张卡片,我对OK按钮的点击不感兴趣。
我想在没有任何轮询的情况下实现这一点,但我不确定最好的方法。如果我到了等待用户输入的点,我是否使用wait()方法将游戏线程置于睡眠状态,直到ActionListener的事件回调发送通知为止?
否则,正在使用Main中的顺序代码以错误的方式去做吗?我应该在ActionListeners的事件回调中实现所有游戏逻辑吗?
提前致谢。
答案 0 :(得分:1)
Swing是一个事件驱动的环境,你无法控制这些事件何时发生,用户可能点击你程序的某些部分或按一个键,你真的无法控制它。
Swing使用单个线程(AKA The Event Dispatching Thread)或EDT),Swing使用to将事件分派给感兴趣的各方以及绘制请求。任何阻止此线程的操作都会阻止EDT通知您的应用程序事件或绘制请求,这将使您的程序“挂起”
您无法想象GUI,就像控制台程序一样,输入很容易控制,而您需要根据控件的状态以及需要时的对话框来引导用户。
所以...从来没有,永远创建阻止EDTor执行长时间运行或阻塞(例如IO操作)阻止该线程的循环。
永远,永远,从EDT以外的任何线程创建或修改任何UI组件。
您可能希望阅读
答案 1 :(得分:1)
我的顶级类调用Main,它创建所有模型和查看器的实例。我现在正在尝试实现控制器,它将使用ActionListener类来查找用户的按钮点击并相应地修改查看器和模型。关于如何最好地做到这一点我很困惑。
我的游戏设计非常顺序,游戏向用户显示消息,然后等待鼠标点击用户的输入,然后继续等等。因此,我认为我会运行实际在Main中进行一段时间的游戏,其中每次迭代代表游戏中的一轮,直到游戏结束。
这很好,但我要做的是让你的游戏成为一个逐步的游戏(我忘了这个名字)在游戏循环中你根据以前的状态和用户输入改变程序的状态。然后让你的程序的行为依赖于状态。要实现这一点,请考虑创建一个枚举来封装程序状态并使用state design pattern来允许程序根据其状态改变行为。
问题是我只对特定时间用户的一些输入感兴趣。例如,我可能会向用户显示一条消息,并告诉他们单击“确定”按钮继续。此时,我不在乎他们是否点击了其中一张卡片,因为我只是想点击“确定”按钮。在其他时候,我可能会要求用户选择一张卡片,在这种情况下,我正在等他们点击一张卡片,我对OK按钮的点击不感兴趣。
这是状态模式发光的地方,因为它可以让用户点击他想要的地方,但只有你的程序会根据程序的状态响应某些点击。
我想在没有任何轮询的情况下实现这一点,但我不确定最好的方法。如果我到了等待用户输入的点,我是否使用wait()方法将游戏线程置于睡眠状态,直到ActionListener的事件回调发送通知为止?
正确 - 不要进行轮询,也不要使用wait()或其他可能阻止程序流的东西。