Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于游戏的设计,OOP_Java_Oop - Fatal编程技术网

Java 关于游戏的设计,OOP

Java 关于游戏的设计,OOP,java,oop,Java,Oop,我正在制作一个小的电子游戏。我正在努力做好oop/设计 我有一个地图对象和一个相机对象。它们都是在“世界”对象中创建的 但是有一个问题。在地图中,我渲染并更新所有内容。出于性能原因,我只想更新/渲染仅在播放器屏幕上显示的内容 摄影机对象具有此信息,但贴图对象无法获取此信息 我有几种方法可以获得这些信息,但我想获得一个关于如何做的选项。这里最相关的OO原则可能是 考虑以下责任声明: Map对象负责保存世界布局 摄影机对象负责维护用于观察世界的视点 有鉴于此,让Map负责呈现屏幕上的内容显然超出

我正在制作一个小的电子游戏。我正在努力做好oop/设计

我有一个地图对象和一个相机对象。它们都是在“世界”对象中创建的

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

摄影机对象具有此信息,但贴图对象无法获取此信息


我有几种方法可以获得这些信息,但我想获得一个关于如何做的选项。

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

考虑以下责任声明:

  • Map
    对象负责保存世界布局
  • 摄影机
    对象负责维护用于观察世界的视点
有鉴于此,让
Map
负责呈现屏幕上的内容显然超出了其权限

您可能应该有一个
WorldRenderer
,它应该接收
贴图和
相机
,以便渲染屏幕。 当我们讨论好的设计主题时,您可能还希望使
WorldRenderer
在本质上是不可变的-它将在构建时接收
地图
相机
,从那时起,这些引用不能更改,例如:

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) {
        ...
    }
}
公共类WorldRenderer{
私人最终地图;
私人最终摄像机;
私人最终清单光源;
公共世界渲染器(地图、摄影机、列表源){
this.map=map;
这个。照相机=照相机;
这个。光源=光源;
}
公共无效呈现(){
Viewport=camera.getViewport();
Map submap=Map.getVisibleMapFor(视口);
场景litScene=applyLighting(submap);//使用光源
渲染场景(litScene);
}
专用空心渲染场景(场景){
...
}
}

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

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

考虑以下责任声明:

  • Map
    对象负责保存世界布局
  • 摄影机
    对象负责维护用于观察世界的视点
有鉴于此,让
Map
负责呈现屏幕上的内容显然超出了其权限

您可能应该有一个
WorldRenderer
,它应该接收
贴图和
相机
,以便渲染屏幕。 当我们讨论好的设计主题时,您可能还希望使
WorldRenderer
在本质上是不可变的-它将在构建时接收
地图
相机
,从那时起,这些引用不能更改,例如:

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) {
        ...
    }
}
公共类WorldRenderer{
私人最终地图;
私人最终摄像机;
私人最终清单光源;
公共世界渲染器(地图、摄影机、列表源){
this.map=map;
这个。照相机=照相机;
这个。光源=光源;
}
公共无效呈现(){
Viewport=camera.getViewport();
Map submap=Map.getVisibleMapFor(视口);
场景litScene=applyLighting(submap);//使用光源
渲染场景(litScene);
}
专用空心渲染场景(场景){
...
}
}

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

我个人会更新所有内容,即使它不在视图中,只是为了当某些内容进入视图时,它已经处于其位置。至于渲染,您可以始终实现自己版本的draw()或paint()方法,以仅绘制摄影机看到的对象。这只是一种简单的算法。

我会亲自更新所有内容,即使它不在视图中,这样当某些内容进入视图时,它已经处于其位置。至于渲染,您可以始终实现自己版本的draw()或paint()方法,以仅绘制摄影机看到的对象。这只是一种简单的算法。

谢谢,这是一个非常好的设计!这更有意义。你从哪里学会那样思考的?你有什么建议吗?当我还是个小孩的时候,我被一群面向对象的蜘蛛攻击,(实际上是一组)其中一只在我的大脑皮层下了一个蛋。从那以后,我从对象的角度看待一切:-)只是开玩笑;我从中得到最多的书是经典的GOF模式,Bob叔叔的和Jeff Langr低估的。多练习!谢谢,这是一个非常好的设计!这更有意义。你从哪里学会那样思考的?你有什么建议吗?当我还是个小孩的时候,我被一群面向对象的蜘蛛攻击,(实际上是一组)其中一只在我的大脑皮层下了一个蛋。从那以后,我从对象的角度看待一切:-)只是开玩笑;我从中得到最多的书是经典的GOF模式,Bob叔叔的和Jeff Langr低估的。多练习!