我正在开发一个单一形式的c#游戏,它由许多用户控件,信用面板,游戏动作历史面板等组成。 我开发了一个Manager类来将Interface与“游戏引擎”分开,这个Manager类负责所有游戏逻辑。但我对我的解决方案不满意。
所以这里有一个问题,对于这种情况最好的方法是什么?
一个充满用户控件的表单通过公共属性公开其对象,还有一个Manager类来处理“引擎”?可以使用什么样的设计模式?游戏是SicBo的c#版本。
非常感谢提前
答案 0 :(得分:2)
您已经完成了将界面与引擎分离的第一个关键步骤。通过将发动机和接口分成较小的部件可以进一步获得。例如,输入控制器,渲染器,动画管理器,转弯系统,单位/卡/件等等。
人们可以告诉你一些事情,但我的建议是不要潜入第一款希望设计正确的游戏。计划通过您编写的每个游戏改进设计并从个人经验中学习。接受你的早期游戏会有糟糕的设计会让你更有效率。保持节奏更重要,不要陷入设计决策和思考模式。一个混乱的代码完成的游戏是一个游戏。一个从未完成的精心设计的游戏不是。我所知道的一些最富有成效(业余)的游戏开发者在他们最初的游戏中编写了可怕的代码。他们只是通过它完成了它。
答案 1 :(得分:1)
如果您的游戏比简单的迷宫或其他东西更复杂,您会想要分开关注点。另一位评论者提到了MVC。我也推荐这个建议(虽然有经验的游戏开发者肯定会有更合适的方法)。
我将通过几个步骤来处理它:模型,操纵和交互
首先,考虑一下你将允许你的游戏进入的状态。例如,在国际象棋中,有一个包含8x8平方位置,两个玩家和属于 必须占用未占用方格的播放器。因此,您的第一步是考虑如何模拟游戏所允许的状态:
interface IChessGame
{
IPlayer PlayerA { get; }
IPlayer PlayerB { get; }
IChessBoard ChessBoard { get; }
}
// Etc etc.
那部分是非常基础的。模型的稳健性将对实施后续步骤的容易程度产生很大影响。
接下来,考虑一下你的游戏,应用程序等状态如何操纵。这些最终将成为你命令的组成部分。举一个静态的例子:
static IChessGame MovePiece(IChessGame oldState, IChessPiece chessPiece, int[,] newLocation)
{
// Check the chess piece.
// See if the new coordinates are allowed for that piece.
// Deal with any collisions (e.g. if an opponents piece is in the square then kill it, if it's your piece then block the move, etc.)
// Generate a new, allowed, state
}
现在你有了可能操纵游戏状态的命令。你如何设计这些将取决于严重你的模型方法(可变,不可变,包含contentChanged事件等)
现在你有一个模型代表游戏的状态和操纵该状态的工具。最后一步是设计一种方法,您的用户可以通过该方法开始使用它,即UI /控制台。
这会根据您完成其他两个步骤的具体情况而有所改变,但我强烈建议您执行前面的步骤,不要担心您的互动。
答案 2 :(得分:0)
也许您正在寻找 MVC模式。我不是游戏开发者,但这是应用程序的标准,我在大多数项目中使用它。
关于如何使用此模式有很多资源。 This link will show an example如何在游戏设计中使用它。
MVC模式将帮助您使用“经理”将“引擎”与“用户控件”分开。
基于你的问题,听起来你已经这样做了吗?为什么你对目前的解决方案不满意?