设计,关于游戏的OOP

时间:2011-10-18 03:04:21

标签: java oop

我正在制作一个小型视频游戏。我正在努力做好oop / design。

我有一个地图对象和一个摄像头对象。这些都是在“世界”对象中创建的。

但是有一个问题。在地图中,我渲染并更新所有内容。出于性能原因,我只想更新/渲染播放器屏幕上的内容。

相机对象具有此信息 - 但地图对象无法访问它。

我可以通过几种方式获取此信息,但希望获得有关如何操作的选项。

2 个答案:

答案 0 :(得分:7)

这里可能最相关的OO原则是Single Responsibility Principle

考虑这些责任声明:

  • Map对象负责保存世界布局
  • Camera对象负责维护用于观察世界的视点

鉴于此,让Map负责呈现屏幕上的内容显然不属于其管辖范围。

你应该有一个WorldRenderer,它应该接纳 MapCamera才能呈现屏幕。 虽然我们处于良好设计的主题,但您可能还希望WorldRenderer具有不可变性 - 在构建时需要MapCamera,从那时起on,这些引用不能改变,例如:

public class WorldRenderer {
    private final Map map;
    private final Camera camera;
    private final List<LightSource> lightSources;

    public WorldRenderer(Map map, Camera camera, List<LightSource> sources) {
        this.map = map;
        this.camera = camera;
        this.lightSources = sources;
    }

    public void render() {
        Viewport viewport = camera.getViewport();
        Map submap = map.getVisibleMapFor(viewport);
        Scene litScene = applyLighting(submap); // using lightSources
        renderScene(litScene);
    }

    private void renderScene(Scene scene) {
        ...
    }
}

...您可能已经注意到该示例也提供了一些光源。同样,那是使用SRP将渲染过程与其组件元素分离。

答案 1 :(得分:0)

我会亲自更新所有内容,即使它不在视图中,以便当某些内容进入视图时它已经处于其位置。至于渲染,你总是可以实现自己的draw()或paint()方法版本,只绘制相机看到的东西。它只是某种简单的算法。