我尝试实现一个小游戏项目,深入研究OO编程(winforms c ++ / cli)。 我已经开始编码,但现在我想重新设计。 游戏开始时应该包括游戏引擎,用户界面,高分和游乐场四个部分。这是一个小的(不符合UML的)类图表,可视化我的目的
这是正确的方法吗? 在我看来,游戏引擎负责控制游戏序列(状态机?)并在所有其他类之间交换信息。
我感谢任何帮助!
编辑:
所以这是一款非常简单的游戏,没什么大不了的!这是我现在所做的一个链接: http://www.file-upload.net/download-2595287/conways_project.exe.html (没有病毒:)但我想你需要.NET框架来使它工作)
答案 0 :(得分:6)
很遗憾,您当前的设计很糟糕:)
我不会说我的建议实际上是最好的解决方案,因为在游戏设计中通常会有“没有最好的”解决方案,但我认为它会让你思考得恰到好处。
更大的UML here.
alt text http://yuml.me/1924128b
假设你有基础班Game
。这是一个抽象的类,它包含了你所有的游戏逻辑,并作为一种瑞士刀。
您应该创建另外两个类 - UI
和State
(显然,它封装游戏UI操作并存储当前游戏状态)。让您的Game
班级保留UI
和State
个实例。
现在,您的Game
课程应该有控制游戏的基本方法。它们可能是普通的render(...)
和update(...)
方法,这部分实际上有点棘手。如果您的游戏是实时游戏,则必须每隔Y毫秒更新一次状态,因此应该循环调用update(...)
。
如果您的游戏实际上并不是实时的,那么只有当用户做某事或您实际知道您需要更改某些内容时,才会发生更新。你可以在这里实现一个消息队列,update(...)
调用只会刷新所有这些消息。
现在,render(...)
方法。创建一个类并将其命名为Backend
- 让这个类封装所有绘图可能性。 这里有一个非常酷的东西 - 你可以让你的Backend
成为一个抽象的超类,并创建一些具体的后端,这些后端派生自Backend
。这实际上会让您有机会通过简单的代码操作切换Backends
。
之后,您应该将Backend
实例传递给render(...)
方法,该方法可以进行适当的绘制,并且可以通过以下方式编写逻辑:
foreach (const Object& object, game_state) {
object->render(backend); // Or something like that
}
最后要提到的是,你的游戏状态。你可以有一个简单的结构来保存你所有当前的对象,得分等等。让每个对象访问GameState
结构,一切都会好的。
实际上,有很多事情要考虑,如果你愿意,我可以写更多关于这个游戏设计方法并分享一些技巧:)
答案 1 :(得分:1)
您的“游戏引擎”可能更多地被视为“数学图书馆”。您可能希望在“游戏”和其他服务器类之间插入另一个对象,这些服务器类将“游戏”的要求“委托”到服务器类并称之为“游戏引擎”。
也许“高分”和“游乐场”可以组合成一个代表“游戏状态”的类,并直接指向“游戏”。 'Playground'可以是一个服务器类,它封装任何代码来实现所述背景的实际呈现,其中这通常代表'渲染类'。
IMHO