Java MVC游戏中的视图和模型

时间:2015-03-27 19:19:34

标签: java swing model-view-controller

我真的不明白如何划分模型和视图的类。

假设我有一个类Cat,它有一些参数,如颜色,年龄,地图上的位置和其他一些东西。我认为创建自定义绘画的最佳方法是覆盖paintComponent方法。但是,Cat类应该在模型中,并且它不应该知道它在视图中呈现的方式。

那么如何画猫?假设它由一组图像表示,并且模型具有可变方向,其可以包含从0到3的int,其与阵列中的图片相关。画一只猫应该怎么做?它应该只在某个地方:

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

2 个答案:

答案 0 :(得分:2)

  

假设Cat类由图像数组表示,模型具有可变方向,可以包含0到3的int,它与数组中的图片有关。

在表示扩展JPanel的绘图面板的类中,保留一个Image。

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

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

this.image = cat.getImage(imageNumber);

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

drawImage(image, 0, 0, this);

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

答案 1 :(得分:0)

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

现在供您查看。它可以访问要更新/绘制的UI组件,并使用java.util.Observer界面来监听Cat个事件。将Cat传递给视图的构造函数并添加一个观察者。您必须确定视图是否扩展Observer,还是使用其他内部或匿名类。现在,当猫移动时,视图将获得事件并调用getPosition(),它将用于从图像阵列中选择正确的图像。任何图像或绘图说明都将在视图中,但基于Cat模型的属性。

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

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