我正在制作一个小型视频游戏。我正在努力做好oop / design。
我有一个地图对象和一个摄像头对象。这些都是在“世界”对象中创建的。
但是有一个问题。在地图中,我渲染并更新所有内容。出于性能原因,我只想更新/渲染播放器屏幕上的内容。
相机对象具有此信息 - 但地图对象无法访问它。
我可以通过几种方式获取此信息,但希望获得有关如何操作的选项。
答案 0 :(得分:7)
这里可能最相关的OO原则是Single Responsibility Principle。
考虑这些责任声明:
Map
对象负责保存世界布局Camera
对象负责维护用于观察世界的视点鉴于此,让Map
负责呈现屏幕上的内容显然不属于其管辖范围。
你应该有一个WorldRenderer
,它应该接纳 Map
和Camera
才能呈现屏幕。
虽然我们处于良好设计的主题,但您可能还希望WorldRenderer
具有不可变性 - 在构建时需要Map
和Camera
,从那时起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()方法版本,只绘制相机看到的东西。它只是某种简单的算法。