【问题标题】:Quick question regarding MVC framework for a java game关于 Java 游戏的 MVC 框架的快速问题
【发布时间】:2010-05-22 06:11:13
【问题描述】:

我有一个关于将 MVC 框架用于我用 java 编写的二十一点游戏的问题。据我了解,我的模型将是一个存储游戏状态的类,更具体地说,是每个玩家手的状态。在模型类中,我将有一个侦听器数组,每次游戏状态发生变化时都会通知它们(即玩家抽到一张新牌)。

这些侦听器将是我的查看器,它是处理游戏显示的类。此类将实现 ActionListener 接口,并且每次模型更改时,它都会调用/“通知”我的查看器的 actionPerformed 方法。

我的问题如下: 我打算有两个 JPanel,每个都专门用于显示各自玩家的手牌。当玩家抽出一张新牌时,一个新的 ImageIcon 将被添加到面板中。我的问题是查看器类如何知道已将哪张牌添加到玩家的手上?

我想我可以在通知事件之前存储玩家的手,然后在通知事件发生时,将新状态与旧状态进行比较,以找出发生了什么变化。我在这里完全是新手,所以我可能完全错了,但这样做似乎有点乏味。

是否有更有效/更常见的方法来检测模型在前后状态之间发生了什么变化?另一种解决方案是在每次通知发生时重新绘制整个面板?这会是一个更好的主意吗?

【问题讨论】:

    标签: java model-view-controller


    【解决方案1】:

    ActionListener 专注于按钮行为。在您的用例中,我建议您创建自己的侦听器类,该类带有一个包含事件类型和值的自定义事件。通常,事件种类可以是“新卡”、“新手”,值可以是玩家id和卡值。

    对于一个干净的 MVC 实现,您的面板应该从事件对象中获取他们需要的所有事件信息。它越独立于全局上下文,它的可重用性和健壮性就越高。

    【讨论】:

      【解决方案2】:

      当玩家抽出一张新牌时,一个新的 ImageIcon 将被添加到面板中。我的问题是查看器类如何知道玩家手上添加了什么牌?

      一般来说,你可以有一个BlackJackListener 接口,它有一个名为notifyNewCard(player, card) 之类的方法。 (例如,你不必通过ActionListener,你可以有更详细的东西。)

      另一种解决方案是在每次通知发生时重绘整个面板?这会是一个更好的主意吗?

      但是,在这种情况下,我会采用的解决方案只是按照您上面的建议重新读取 BlackJack 模型的整个状态。状态将非常简单,因此没有“性能影响”可谈,并且您不会冒与模型“不同步”的风险。

      在这样的解决方案中,你只需要使用ChangeListener 并说,“发生了一些事情,更新你对我的看法”。

      【讨论】:

        【解决方案3】:

        您可以将事件对象传递给模型侦听器,这些侦听器包含有关所发生事件的详细信息(ADDREMOVEREPLACE 或复杂的CHANGE)以及有关新旧值的信息。 JDK 中这种方法的一个示例是 javax.swing.event.ListDataEventjavax.swing.event.ListDataListenerjavax.swig.ListModel

        【讨论】:

          猜你喜欢
          • 2010-12-12
          • 1970-01-01
          • 2021-04-18
          • 2011-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多