如何在 Monogame 中构建项目
How to structure a project in Monogame
我正在尝试创建 PC 版的线控回合制桌游。我选择了 C# 中的 Monogame 框架。我仍在学习 C# 和 Monogame,并且正在阅读所有关于“拆分”data/game 引擎部分和 graphics/GUI 部分中的代码的重要性的所有内容。所以为了追求这个,我有以下想法。
Graphics/GUI
这里我定义了所有 class 与屏幕(游戏 - 菜单)、GUI 组件(如标签和按钮,甚至可能是鼠标和键盘输入)相关的所有 classes(用户必须点击某些东西的逻辑在 gui 中执行操作)。
数据或游戏logic/Engine
我什至不确定我应该如何称呼项目的这一部分,我会把游戏的所有逻辑放在这里。 class玩家、卡牌、“IA”、规则等的 classes 将在此处定义。
我现在的困难是理解如何连接这两个部分但仍然保持“松散耦合”的方法。我在想,也许游戏逻辑部分的对象或更好的实例必须订阅 GUI 部分中定义的事件(例如 button_click)...但我什至可以订阅另一个 class?这是正确的方法吗?
我承认我仍在尝试完全理解事件驱动的概念,但这是在 C# 和 Monogame 中做事的正确方法吗?
对于含糊不清的事情,我深表歉意 topic/question 但提前致谢。
我对 Monogame 一无所知,但通常将任何类型的应用程序组织成这样的层是个好主意,只要这样做不会使代码过于复杂。您将 UI 代码与游戏逻辑分开的想法听起来是个不错的开始。
首先,将您的应用程序想象成一个洋葱,具有一系列同心层。您建议的结构只有两层,但没关系。更大的应用程序可能受益于更多层,例如一个数据访问层,如果你要将游戏的状态存储在数据库中,但没有必要为了拥有更多层而添加额外的层。
您的最外层将包含 UI 代码,通常这称为表示层。
您的最内层将包含游戏逻辑,通常这被称为领域层。判断某物是否属于域层的一个很好的经验法则是问,这是否代表您的应用程序的用户(或您的游戏的玩家)不是开发人员会认可的东西?
其次,请记住每一层都可以调用同一层中的代码,或者调用它内部的其他层中的代码,但不能调用它之外的层中的代码。因此表示层中的项目可以引用领域层中的项目,但领域层中的项目不能引用表示层中的项目。如果两层之间有循环引用,则表明其中一层中的某些内容实际上属于另一层。
这是对应用程序分层的类似问题的另一个答案,尽管不是在游戏的上下文中:
关于问题的第二部分,如果您想使用事件,那么最好在表示层中处理任何事件,并让事件处理程序调用域层(但免责声明,我不知道 Monogame)。
我正在尝试创建 PC 版的线控回合制桌游。我选择了 C# 中的 Monogame 框架。我仍在学习 C# 和 Monogame,并且正在阅读所有关于“拆分”data/game 引擎部分和 graphics/GUI 部分中的代码的重要性的所有内容。所以为了追求这个,我有以下想法。
Graphics/GUI
这里我定义了所有 class 与屏幕(游戏 - 菜单)、GUI 组件(如标签和按钮,甚至可能是鼠标和键盘输入)相关的所有 classes(用户必须点击某些东西的逻辑在 gui 中执行操作)。
数据或游戏logic/Engine
我什至不确定我应该如何称呼项目的这一部分,我会把游戏的所有逻辑放在这里。 class玩家、卡牌、“IA”、规则等的 classes 将在此处定义。
我现在的困难是理解如何连接这两个部分但仍然保持“松散耦合”的方法。我在想,也许游戏逻辑部分的对象或更好的实例必须订阅 GUI 部分中定义的事件(例如 button_click)...但我什至可以订阅另一个 class?这是正确的方法吗?
我承认我仍在尝试完全理解事件驱动的概念,但这是在 C# 和 Monogame 中做事的正确方法吗? 对于含糊不清的事情,我深表歉意 topic/question 但提前致谢。
我对 Monogame 一无所知,但通常将任何类型的应用程序组织成这样的层是个好主意,只要这样做不会使代码过于复杂。您将 UI 代码与游戏逻辑分开的想法听起来是个不错的开始。
首先,将您的应用程序想象成一个洋葱,具有一系列同心层。您建议的结构只有两层,但没关系。更大的应用程序可能受益于更多层,例如一个数据访问层,如果你要将游戏的状态存储在数据库中,但没有必要为了拥有更多层而添加额外的层。
您的最外层将包含 UI 代码,通常这称为表示层。
您的最内层将包含游戏逻辑,通常这被称为领域层。判断某物是否属于域层的一个很好的经验法则是问,这是否代表您的应用程序的用户(或您的游戏的玩家)不是开发人员会认可的东西?
其次,请记住每一层都可以调用同一层中的代码,或者调用它内部的其他层中的代码,但不能调用它之外的层中的代码。因此表示层中的项目可以引用领域层中的项目,但领域层中的项目不能引用表示层中的项目。如果两层之间有循环引用,则表明其中一层中的某些内容实际上属于另一层。
这是对应用程序分层的类似问题的另一个答案,尽管不是在游戏的上下文中:
关于问题的第二部分,如果您想使用事件,那么最好在表示层中处理任何事件,并让事件处理程序调用域层(但免责声明,我不知道 Monogame)。