【问题标题】:MVC Game Design with objects带有对象的 MVC 游戏设计
【发布时间】:2011-09-21 17:19:00
【问题描述】:

我在 python 中编写了一个简单的类似推箱子的 2D 游戏,我想清理它。它以一种 OO 方式完成,游戏中的每个对象都有一个 Draw 函数,我可以调用它来重绘屏幕。效果很好,因为我可以遍历屏幕上的每个位置并调用对象的绘制函数。

我正在学习设计模式,我真的很喜欢 MVC 的好处,但是我没有看到一种干净的方法来将每个对象具有的绘图功能与模型分开以放入视图中。有没有好的方法来做到这一点?这是我不应该使用 MVC 设计的情况吗?

【问题讨论】:

    标签: python model-view-controller oop


    【解决方案1】:

    MVC 有时可能会违反直觉,尤其是当您第一次学习 OO 并发现使用“绘制”方法可以让事情变得如此有条理时!

    以下是您可以为游戏实现 MVC 的多种方法之一的概述:

    型号:

    • “盒子”:box_type、pos_x、pos_y
    • “BoxManager”:列表(框)
    • “游戏状态”:box_manager、player_manager、goal_manager、...
    • “移动”:dx, dy

    控制器:

    • “游戏控制器”:check_valid_move(move)、move_player(move)、is_goal_state()、...

    查看:

    • “屏幕”:渲染()
    • “PlayerRenderer”:渲染()
    • “BoxRenderer”:render_box(box)、render_all_boxes()

    请注意模型是如何完全独立的并且不引用控制器或视图模块。这是 MVC 的关键方面之一。 控制器接受玩家输入并操纵全局游戏状态。 视图查看全局游戏状态并渲染屏幕。

    您不必走这条路,但这是一个值得理解和考虑的选择。

    【讨论】:

    • 我不同意你的一个关键点是,在你的例子中,你的控制器中有check_valid_move()。但是这种保持模型一致的逻辑,其实应该在模型中。将另一个控制器或视图附加到模型不应改变游戏规则。
    【解决方案2】:

    重构您的代码以符合 MVC 意味着创建一个“视图”(就像代表您的屏幕一样,并且该视图将具有(例如)一个采用“模型”的 draw 方法(一个包含所有方块状态)并将该模型渲染到屏幕上。

    现在,绘制到屏幕上的所有方法可能就是在每个块对象上调用renderToScreen(screenView) 方法。或者,如果您想更“纯粹”,您可以将该 draw 方法重构到视图中。

    【讨论】:

      【解决方案3】:

      我将很快明确说明的一个方面是,当您的模型更改时,它不能调用视图说“呈现此更改” - 因为模型不应该知道视图。

      相反,模型会引发一个事件来表示它已更改,并且视图会在收到这些事件时根据需要重新渲染。视图知道模型并订阅其事件,但模型对接收事件的事物一无所知。

      例如,我正在编写一个 OpenGL 应用程序,其中模型包含简单的归一化多边形和多面体,它们在几何上很适合使用,但不方便传递给 OpenGL。当视图接收到模型已更改(添加或修改形状)的事件时,视图会将这些多边形转换为可以传递给 OpenGL 的非规范化顶点数组。这是一个昂贵的操作,因此视图将这些数组缓存在它自己的“需要渲染的内容”集合中,当它渲染时,它只是遍历这个“视图集合”,将每个数组传递给 OpenGL。所以视图是唯一知道 OpenGL 的代码,也是唯一知道如何将模型状态转换为 OpenGL 结构的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        相关资源
        最近更新 更多