1

我正在开发一个单一形式的 c# 游戏,它由许多用户控件、积分面板、游戏操作的历史面板等组成。我开发了一个 Manager 类来将 Interface 与“游戏引擎”分开,这个 Manager 类负责所有游戏逻辑。但我对我的解决方案不满意。

那么问题来了,对于这种情况,最好的方法是什么?

一个充满用户控件的表单,通过公共属性和一个管理器类公开其对象来处理“引擎”?可以使用什么样的设计模式?游戏是ac#版骰宝。

提前谢谢了

4

3 回答 3

2

您已经完成了将界面与引擎分离的第一个关键步骤。通过将引擎和接口拆分为较小的组件,可以获得更多收益。例如输入控制器、渲染器、动画管理器、转向系统、单位/卡片/件或其他。

人们可以告诉你一些事情,但我的建议是不要在第一款游戏中就期望设计正确。计划在您编写的每款游戏中改进设计,并从个人经验中学习。接受您的早期游戏将有糟糕的设计将使您更有效率。更重要的是保持节奏,不要陷入设计决策和模式思考中。代码混乱的完成游戏就是游戏。一个设计精良但从未完成的游戏不是。我认识的一些最有生产力(业余)的游戏开发者在他们的初始游戏中编写了可怕的代码。他们只是通过它并完成了它。

于 2013-09-19T11:43:12.017 回答
1

如果您的游戏比简单的迷宫或其他东西更复杂,您将需要分离关注点。另一位评论者提到了 MVC。我也推荐这个建议(尽管有经验的游戏开发者肯定会有更合适的方法)。

我会分几步来处理它:ModelManipulationInteraction

模型

首先,考虑一下您将允许您的游戏处于什么状态。例如,在国际象棋中,有一个包含 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/控制台。

这将根据您完成其他两个步骤的准确程度而发生很大变化,但我强烈建议您执行前面的步骤而不必担心您的交互。

于 2013-09-19T11:35:36.943 回答
0

也许您正在寻找MVC 模式。我不是游戏开发人员,但这是应用程序的标准,我将它用于大多数项目。

有很多关于如何使用这种模式的资源。这个链接将展示一个具体如何在游戏设计中使用它的例子。

MVC 模式将帮助您使用“经理”将“引擎”与“用户控件”分开。

根据您的问题,听起来您已经这样做了……?为什么您对当前的解决方案不满意?

于 2013-09-19T10:48:50.427 回答