1

我正在制作一个简单的井字游戏作为 LWJGL 中的练习。

当我编写方法来绘制棋盘方格和棋子(例如 x 和 o 棋子)时,是否应该将它们放在一个 graphicsLib 类中,然后可以由棋盘等各种对象调用?还是让每个对象包含绘制自己元素的代码是否被认为是最佳实践?我希望使代码尽可能可扩展。

具体来说,我有一个 Board 类,它是 Square 类型的对象的集合,并且为正方形对象分配了一个枚举状态 CLEAR、X 或 O。然后我在状态上运行一个 switch 语句,它将调用适当的方法来绘制广场。我应该将每个方法放在自己的对象中,还是拥有一个大型图形对象(例如公共类 graphicsLib),然后提供绘制各种元素的方法?

组织这个的最佳方式是什么?

4

1 回答 1

1

在可能的情况下,尽可能使用面向对象的方法。当我写这样的东西时,我通常会让我的每个对象至少提供两种方法:

public void update(int delta);
public void render();

这样我的对象和它们的许多实例都知道如何更新自己和渲染自己。update然后,您可以构建您的代码,以便您的 Board 类的更新和渲染方法将render在其子 Squares 上调用(参见下面的示例)。这提供了一些好处:

  1. 对象的绘制/更新与该对象的表示紧密相关(关注点分离)。
  2. 随着您的“模型”类变得复杂,您的渲染函数与该数据接近,因此您的 API 保持稳定。如果您有一个绘图类,您可以想象您必须将大量数据传递给绘图类,并且每个调用都必须随着模型的变化而定制和更改。
  3. 你不会有一个巨大的类来提供一个用于绘制所有东西的 API。这将很快变得庞大而笨拙。
  4. 您具有画家算法的内置结构,因为您具有基于父/子关系绘制事物的层次结构。您只需要按照每个父母的render方法正确管理您的兄弟姐妹。

这是层次结构渲染的示例。

public class Board {
    List<Square> squares;

    public render() {
        // Render your board first
        ...

        // Render child squares
        for (Square square : squares) {
            square.render();
        }
    }
}

所以你可以想象,你的主游戏循环可以简单地告诉你的棋盘对象进行渲染,你就完成了。您不需要对董事会可能需要呈现的其他内容有任何深入的了解。

于 2013-01-11T17:36:43.520 回答