Graphics 基于2d瓷砖的游戏设计,如何使用视口绘制地图?

Graphics 基于2d瓷砖的游戏设计,如何使用视口绘制地图?,graphics,xna,Graphics,Xna,我已经为此挣扎了一段时间 目前,我有一个100乘100的格子,属于地图 地图实现了IDrawable。我称之为Draw,它在0,0处绘制,这很好 但是,我想将其展开以绘制一个视口。玩家将被画在中间的屏幕上,因此我想在每个方向上显示10个瓦片,而不是整个地图。 我很难想出这个的架构。我的思维方式是,事物应该自己画出来(我说的是player1,画就画自己)。这在以前是可行的,它在屏幕上的x,y位置绘制播放器,但在视口中,它将不再知道在哪里绘制自己 那么,是否应该让视口绘制,检查游戏中的每个对象并绘制

我已经为此挣扎了一段时间

目前,我有一个100乘100的格子,属于地图

地图实现了IDrawable。我称之为Draw,它在0,0处绘制,这很好

但是,我想将其展开以绘制一个视口。玩家将被画在中间的屏幕上,因此我想在每个方向上显示10个瓦片,而不是整个地图。

我很难想出这个的架构。我的思维方式是,事物应该自己画出来(我说的是player1,画就画自己)。这在以前是可行的,它在屏幕上的x,y位置绘制播放器,但在视口中,它将不再知道在哪里绘制自己

那么,是否应该让视口绘制,检查游戏中的每个对象并绘制可见的对象?地图分幅是否应该是受此影响的对象?或者视口应该通过将两者耦合在一起智能地绘制地图

我很想知道典型的滚动瓷砖游戏是如何做到这一点的

如果有关系的话,我用的是XNA


编辑以添加:您是否可以执行图形操作,例如尝试HTML呈现方法,在这种方法中,您告诉对象要绘制,然后它们返回自己的图形,然后父对象将图形放置在正确的位置?我在想,如果我有两个并排用于splitscreen的视口,我该如何阻止它们在边缘之外绘制?

一些基本的想法,不是专门针对XNA的:

对象在世界坐标系中将自己绘制到虚拟屏幕,而不是直接将自己绘制到屏幕 可绘制对象获取图形上下文对象,该对象为您提供图形API。图形上下文了解当前视口边界,并为每个图形操作实现从世界坐标到屏幕坐标的坐标转换。如果需要双缓冲,图形上下文也会直接绘制到屏幕或背景屏幕缓冲区。 当视口的可见边界之外有许多对象时,作为性能优化,图形循环可以对对象进行手动边界检查,并测试它们是否完全在可见区域之外。如果是这样,就没有必要让他们自己画了。
一些基本想法,并非针对XNA:

对象在世界坐标系中将自己绘制到虚拟屏幕,而不是直接将自己绘制到屏幕 可绘制对象获取图形上下文对象,该对象为您提供图形API。图形上下文了解当前视口边界,并为每个图形操作实现从世界坐标到屏幕坐标的坐标转换。如果需要双缓冲,图形上下文也会直接绘制到屏幕或背景屏幕缓冲区。 当视口的可见边界之外有许多对象时,作为性能优化,图形循环可以对对象进行手动边界检查,并测试它们是否完全在可见区域之外。如果是这样,就没有必要让他们自己画了。 可能的设计:

存在一个包含对象实例的二维世界。 对象实例是精灵引用+其在世界中的坐标。 在绘制场景时,您请求存在于给定2D区域中的可见对象列表,然后绘制它们。 有了这样的设计,世界会变得非常巨大

我的思维方式是,事物应该自己画出来(我说的是player1,画就画自己)

可见的东西应该自己画。视口之外的对象不可见

,我怎样才能阻止他们画出边缘

不确定XNA,但OpenGL有剪刀测试/glViewport,Direct3D 9有SetViewport方法,允许您使用部分屏幕/窗口进行渲染。还有Clipplane和stencil buffer,使用stencil进行2D剪裁是过分的,不过您也可以先渲染到纹理,然后再渲染纹理。有很多方法可以解决这个问题

那么,是否应该让视口绘制,检查游戏中的每个对象并绘制可见的对象

对于一个大世界,你不应该检查每一个物体,因为它会很慢。您应该能够找到可见的对象,而无需测试每一个对象。为此,您需要某种空间分区-四叉树,因为我们在2D、k-d树中,等等。这样,您应该能够处理数千个甚至数十万个对象,只要您不同时看到它们

地图分幅是否应该是受此影响的对象

如果你继续画看不见的东西,FPS会下降

它们返回自己的图形

对于2D游戏,这可能非常慢。记住接吻原则。

可能的设计:

存在一个包含对象实例的二维世界。 对象实例是一个sp rite参考+其在世界上的坐标。 在绘制场景时,您请求存在于给定2D区域中的可见对象列表,然后绘制它们。 有了这样的设计,世界会变得非常巨大

我的思维方式是,事物应该自己画出来(我说的是player1,画就画自己)

可见的东西应该自己画。视口之外的对象不可见

,我怎样才能阻止他们画出边缘

不确定XNA,但OpenGL有剪刀测试/glViewport,Direct3D 9有SetViewport方法,允许您使用部分屏幕/窗口进行渲染。还有Clipplane和stencil buffer,使用stencil进行2D剪裁是过分的,不过您也可以先渲染到纹理,然后再渲染纹理。有很多方法可以解决这个问题

那么,是否应该让视口绘制,检查游戏中的每个对象并绘制可见的对象

对于一个大世界,你不应该检查每一个物体,因为它会很慢。您应该能够找到可见的对象,而无需测试每一个对象。为此,您需要某种空间分区-四叉树,因为我们在2D、k-d树中,等等。这样,您应该能够处理数千个甚至数十万个对象,只要您不同时看到它们

地图分幅是否应该是受此影响的对象

如果你继续画看不见的东西,FPS会下降

它们返回自己的图形


对于2D游戏,这可能非常慢。记住接吻原则。

视口应该画东西。然后你们知道什么是可见的,什么是剔除的。视口应该画东西。然后你就知道什么是可见的,什么是被剔除的。为这些信息干杯!渲染到目标,然后将目标渲染到屏幕并裁剪它会有任何明显的速度问题吗?@SLC:嗯,将目标渲染到屏幕应该比直接渲染到屏幕慢,因为你必须绘制大纹理表面。并且以像素到像素的精度渲染大型纹理表面,即纹理匹配屏幕像素,总是会导致速度减慢。当然,如果你想在游戏中应用后期处理过滤器,那么你将无法避免渲染目标。为信息干杯!渲染到目标,然后将目标渲染到屏幕并裁剪它会有任何明显的速度问题吗?@SLC:嗯,将目标渲染到屏幕应该比直接渲染到屏幕慢,因为你必须绘制大纹理表面。并且以像素到像素的精度渲染大型纹理表面,即纹理匹配屏幕像素,总是会导致速度减慢。当然,如果您想在游戏中应用后期处理过滤器,则无法避免渲染目标。