面向对象编程 - 需要你的帮助

时间:2010-06-12 18:16:59

标签: oop c++-cli

我尝试实现一个小游戏项目,深入研究OO编程(winforms c ++ / cli)。 我已经开始编码,但现在我想重新设计。 游戏开始时应该包括游戏引擎,用户界面,高分和游乐场四个部分。这是一个小的(不符合UML的)类图表,可视化我的目的

Class diagram

这是正确的方法吗? 在我看来,游戏引擎负责控制游戏序列(状态机?)并在所有其他类之间交换信息。

我感谢任何帮助!

编辑:

所以这是一款非常简单的游戏,没什么大不了的!这是我现在所做的一个链接: http://www.file-upload.net/download-2595287/conways_project.exe.html (没有病毒:)但我想你需要.NET框架来使它工作)

2 个答案:

答案 0 :(得分:6)

很遗憾,您当前的设计很糟糕:)

我不会说我的建议实际上是最好的解决方案,因为在游戏设计中通常会有“没有最好的”解决方案,但我认为它会让你思考得恰到好处。

更大的UML here.

alt text http://yuml.me/1924128b

假设你有基础班Game。这是一个抽象的类,它包含了你所有的游戏逻辑,并作为一种瑞士刀。

您应该创建另外两个类 - UIState(显然,它封装游戏UI操作并存储当前游戏状态)。让您的Game班级保留UIState个实例。

现在,您的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