2

我正在尝试用更时髦的 UI重新实现我编写的旧黑白棋棋盘游戏。我查看了 Jens Alfke 的 GeekGameBoard 代码以获得灵感,而 CALayers 看起来像是实现 UI 的方式。

然而,在 GeekGameBoard 代码中,模型和视图并没有清晰的分离;模型就是视图,这使得例如制作游戏状态的副本以便为 AI 玩家执行游戏树搜索变得困难。但是,我似乎无法想出另一种结构方法,允许模型和视图分离,而不涉及保持两个平行网格的持续战斗(模型打开,视图一个) 同步。当然,这有其自身的问题。

如何最好地实现 AI 搜索友好的模型结构和显示友好的视图之间的关系?任何建议/经验将不胜感激。我害怕/一半期待着“没有好的答案:尽你所能处理它”这样的答案,但我准备好感到惊讶了!


感谢彼得的回答。但是,我不完全确定我完全理解它。如果您只有一组初始的可以移动甚至移除的部件,我可以看到这是如何工作的,但是当一个人放下一个新部件时会发生什么?它会像这样工作吗:

  1. 用户在视图中单击。
  2. 查看点击被转换为板位置并通知控制器。
  3. 控制器创建一个具有后继状态的新董事会(如果合适,即这是一个合法的举动)。
  4. 视图通过其绑定获取新板,拆除现有的视图/层层次结构并将其替换为当前状态。

听起来对吗?

PS:很抱歉未能指定它是用于 iPhone 还是 Mac。我对适用于 iPhone 的东西最感兴趣,但如果我能让它首先在 Mac 上很好地工作,我相信我可以调整解决方案以自己在 iPhone 上工作。(或发布一个新问题!)

4

2 回答 2

2

理论上,它应该与基于 NSView 的 UI 相同:添加一个模型属性(或多个属性),将它(或它们)公开为绑定,然后通过控制器将视图(层)绑定到模型。

例如,您可能有一个带有 Pieces 的 Board 类(每个 Piece 都有对拥有它的玩家的引用),所有这些都是模型类。您的控制器将拥有一个 Board,并且您的视图/层将能够显示一个 Board,可能每个 Piece 都有一个子视图/子层。

您将板视图/图层绑定到控制器的board属性,并在视图/图层的该属性设置器中,为每个片段创建一个子视图/子图层,并将其绑定到它需要的片段的任何属性。(更换主视图/图层的Board时,不要忘记取消绑定并删除所有子视图/子图层。)

当你想移动或修改一个片段时,你会使用它自己的属性来做;这些将转换为视图/图层上的属性访问。从表面上看,您将设置图层的属性以动画更改(例如,更改 Piece 的属性position会导致图层相应地移动)。

董事会也是如此。您可以让用户更改一种或两种磁贴颜色;您将通过游戏控制器将颜色井绑定到其 Board 对象,并且将视图/图层绑定到同一 Board 的相同属性,它会自动获取更改。

免责声明:我从未将 Core Animation 用于任何事情,如果您询问的是 Cocoa Touch 而不是 Cocoa,上述解决方案将不起作用,因为它依赖于 Cocoa 绑定。

于 2009-07-04T17:35:30.220 回答
0

我有一个 iPhone 应用程序,其中几乎所有界面都是使用 Core Animation CALayers 构建的,并且我使用了与 Peter 描述的非常相似的模式。他是正确的,因为您希望将 CALayers 视为 NSViews / UIViews 并通过控制器管理它们的逻辑,并通过模型对象管理数据。

在我的例子中,我创建了控制器对象的层次结构,这些对象也用作模型对象(我可以重构以拆分模型组件)。每个控制器对象都管理一个 CALayer,因此最终会有一个与模型控制器并行的 CALayer 显示层次结构。对于我的应用程序,我需要对使用此层次结构构造的方程执行计算,因此我使用控制器从树的底部向上提供计算值。控制器还处理用户编辑事件,例如插入新的子操作或删除操作树。

我创建了一个图层托管视图类,它允许 CALayer 树响应触摸或鼠标事件(其源现在在Core Plot项目中可用)。对于您的棋盘游戏示例,CALayer 部件可以接收触摸事件,并让它们的控制器管理后端逻辑(确定合法移动等)。您应该能够四处移动部件并维护相同的控制器,而不会在每次移动时都拆掉所有东西。

于 2009-07-06T03:30:43.730 回答