Java MVC 游戏中的视图和模型

View and Model in Java MVC game

我不太明白如何为模型和视图划分 class。

假设我有一只 class 猫,它有一些参数,如颜色、年龄、在地图上的位置和其他一些东西。我认为创建自定义绘画的最佳方法是重写 paintComponent 方法。然而 Cat class 应该在模型中,它不应该知道它在视图中的呈现方式。

那么怎么画猫呢?假设它由一个图像数组表示,并且模型具有可变方向,它可以包含一个从 0 到 3 的整数,它与数组中的图片相关。画猫应该用什么view?它应该只是在里面的某个地方吗:

drawImage(model.getCat().getArray( model.getCat().getFrame() )) ?

Let's say the Cat class is represented by an array of images and the model has variable direction which can contain an int from 0 to 3 which is related to pictures in array.

在代表绘图面板的 class 中,它扩展了 JPanel,您保留了一个图像。

您必须在构造函数中将一个或多个 Cat 实例传递给绘图面板class。

在您的绘图面板 class 中,您将有一个包含以下行的 setImage 方法:

this.image = cat.getImage(imageNumber);

在您覆盖的 paintComponent 方法中,您将拥有以下行

drawImage(image, 0, 0, this);

看看我的文章 2048 Game in Java Swing,了解如何在游戏中创建和使用模型、视图和控制器。

假设 Cat 模型。用 Cat.setPosition(int position) 之类的东西改变猫的位置。调用需要触发视图可以侦听的事件。一个简单的设置方法是让 Cat 扩展 java.util.Observable 并从 setPosition().

中调用 setChanged()notifyObservers()

现在供您查看。它将可以访问 UI 组件成为 updated/drawn 并使用 java.util.Observer 接口来监听 Cat 事件。将 Cat 传递给视图的构造函数并添加观察者。您必须确定该视图是否扩展 Observer 或您是否使用其他内部或匿名 class。现在,当猫移动时,视图将获取事件并调用 getPosition(),它将用于从图像数组中 select 正确的图像。任何图像或绘图说明都将显示在视图中,但基于 Cat 模型的属性。

那么控制器是什么?它是处理用户事件的任何东西,比如按钮上的 ActionListener。也许您希望用户单击视图中猫的图像以使猫移动到新位置。图像组件点击处理程序是控制器,将调用 Cat.setPosition()。这将导致 Cat 模型触发一个事件,视图将观察该事件,然后在新位置重新绘制猫。

只要一切都由 Swing/AWT 组件事件驱动,您就不必担心线程安全。否则请参阅 passing objects to another thread 了解一些想法。