Flash AS3 MVC游戏:我应该在一个模型中分离数据和游戏规则吗?

Flash AS3 MVC游戏:我应该在一个模型中分离数据和游戏规则吗?,flash,actionscript-3,oop,model-view-controller,Flash,Actionscript 3,Oop,Model View Controller,我觉得MVC错过了一封描述比赛情况的信。在我看来,该模型似乎由两个不同的部分组成: 描述当前游戏状态的一组变量(这些变量将具有在更改时发送事件的setter和getter,以便视图可以访问更改的内容) 游戏规则,用于确定控制器接收到特定输入(即shot();)后会发生什么(这些规则将根据需要更新变量组) 视图将以独占方式从1读取,而控制器将以独占方式与2通信。这就是为什么我要进行区分,并希望将它们分为类1和类2 我的问题: 我不确定我是否应该做出这种区分,因为我在任何地方都没有看到过 如果我应

我觉得MVC错过了一封描述比赛情况的信。在我看来,该模型似乎由两个不同的部分组成:

  • 描述当前游戏状态的一组变量(这些变量将具有在更改时发送事件的setter和getter,以便视图可以访问更改的内容)
  • 游戏规则,用于确定控制器接收到特定输入(即shot();)后会发生什么(这些规则将根据需要更新变量组)
  • 视图将以独占方式从1读取,而控制器将以独占方式与2通信。这就是为什么我要进行区分,并希望将它们分为类1和类2

    我的问题:

    • 我不确定我是否应该做出这种区分,因为我在任何地方都没有看到过
    • 如果我应该;我应该创建两个独立的类,还是应该用类2扩展类1
    • 最后,我很难确保只有class2(而不是视图)可以更改class1中的变量(同时仍然能够在值更改时发送事件)。有什么建议吗

      • 您描述的原因是,传统MVC模型通常同时包含数据存储和应用程序逻辑。如果你试图将它们分割开来,那么你就会遇到你正在思考的情况


        如果您担心视图访问不应该访问的内容,那么您可以将事件中的数据推送到视图,而不是让视图读取事件响应中的数据。仔细阅读观察者模式

        您还可以从helper类(一个用于实例化可观察状态的类、一个用于逻辑的类等)构建您的模型,并在模型中将它们实例化为单例。不过,这并不一定能解决您的访问控制需求

        第三个问题涉及使用“朋友”,一些朋友认为这是一个糟糕的OO构建。AS3的设计者选择不拥有朋友类和方法,作为C++语言的一部分。 如果您没有,那么AS3设计模式手册是处理常见问题(如您所描述的问题)的常用方法的很好参考


        我建议研究PureMVC。它不是一个适用于所有情况的理想框架,但它确实为您描述的问题提供了一些解决方案。在这种情况下,您的游戏状态可以存储/访问在单个代理中,并且逻辑可以/将在多个通知和命令之间分割。有些人认为框架有局限性,但我发现一个设计良好的框架可以让我专注于应用程序的细节,而不是如何实现核心行为。

        PureMVC有一个状态机实用程序。这就是处理游戏状态所需要的。基本上,您定义了一个有限状态机,它描述了您的游戏可以处于的所有状态、它们之间的有效转换以及触发这些转换的操作

        动作作为通知发送到状态机,如果该动作在当前状态下有效,它将首先发送一个退出保护公告(您定义的通知)的通知(如果已定义)。这使任何感兴趣的演员都有机会取消过渡(即,你不能离开房间,因为你被拴在地板上)。然后它发送一个进入守卫通知(您定义的另一个可选通知)。这是感兴趣的演员取消过渡的另一个机会(即,你不能进入房间,因为你没有钥匙)。如果没有取消,那么它将发送一个特定于状态的更改通知,以便感兴趣的参与者可以执行特定于已进入此新状态的活动

        自从80年代初(6502年大会)以来,我就没有编写过游戏逻辑,所以我决定是时候再次玩一玩了。我刚刚使用PureMVC和StateMachine实用程序完成了一个以触摸为中心的策略游戏,我必须说,使用我每天在企业应用程序上使用的工具来做游戏很有趣。不太重,MVC确实适用,状态机使它非常清楚发生了什么以及何时发生的。它是为BB PlayBook构建的,但多亏了AIR,您可以将其签出并安装到桌面上,然后进行尝试

        《地下城乔》:一款以触摸为中心的战略游戏。


        -=克里夫>

        谢谢你。我将研究PureMVC。另外,我对使用我的事件来推送数据感兴趣,但我仍然必须给我的视图访问模型的权限,以便侦听这些事件,不是吗?视图是否可能只听事件,而不知道发送事件的类的其他信息?请阅读观察者模式,它应该回答这两个问题。AS3DP手册中有一章介绍了它,以及AS3应用程序上下文中的MVC。