1

我对 OOP 不是很有经验,所以我想分享一下我目前正在做的事情,并就我应该如何处理几件事征求一些建议。

我目前正在开发一个使用 2d 网格的简单游戏。这是我的班级结构的快速概述:

  • 'GameBoard' - 具有游戏可能的单元状态数组,以及实现规则的方法。
  • 'GameView' - 具有超类 NSView,并作为自定义视图放置在我的窗口中。此类旨在通过将注视映射到其 drawRect: 方法中的图像枚举来从游戏板上读取并绘制数组的内容。
  • 'GameController' - 这是一个中间类,用于初始化游戏板和视图,并处理各种 UI 控件。此类具有“GameBoard”和“GameView”类型的实例变量。

最初,我几乎在 View 类中做所有事情,并且它运行良好,但它开始变得很难真正遵循,这是我想要将我的代码传播到一个新类的主要原因。

我在“GameController”中创建了一个初始化新游戏的方法,其中包含一些用户定义的参数(在代码段中删除以节省空间)。

-(IBACTION)initialiseGame:(id)sender {
    gameBoard = [[GameBoard alloc] init...];
    gameView = [[GameView alloc] init...];
}

我在这里要做的是向游戏视图传递一个指向游戏板实例的指针,以便我可以读取它的数组来绘制游戏的当前状态,例如:

-(void)initWithGameBoard:(GameBoard*)gameBoard;

这是正确的方式吗,还是我应该以不同的方式这样做?

我移动到控制器类的下一个问题是我似乎无法找到如何获取指向我放置在 IB 窗口上的 GameView 实例的指针?最好不要将视图放在界面构建器中的窗口上,而是在 initialiseGame 函数中以编程方式将其放在窗口上?如果是这样,我将如何去做?

我想另一个问题是,我应该放弃这个想法并坚持在 GameDraw 类中做所有事情吗?

非常感谢您花时间阅读本文,对于任何有经验的面向对象程序员来说,这可能是一个非常简单的问题,但我似乎无法在任何地方找到具体的答案。

4

1 回答 1

3

有不止一种方法可以完成这项工作,但我会这样做:

  1. 在 IB 中实例化一次视图。不要自己调用 alloc/init。
  2. 在您的视图控制器中,为您的视图创建一个插座并在 Interface Builder 中连接它。这就是您的控制器将如何访问它。您的视图控制器需要成为文件所有者——可能已经是。
  3. 将视图设计为可重用。给它一个-setGameBoard:控制器调用的方法。确保视图在没有游戏板时可以绘制空白。
  4. 像这样写-initializeGame:

    -(IBAction) initialiseGame:(id) sender {
        gameBoard = [[GameBoard alloc] init...];
        [gameView setGameBoard:gameBoard];
    }
    
于 2012-11-21T17:47:44.560 回答