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