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

时间:2012-03-04 16:45:22

标签: graphics xna

我一直在努力解决这个问题。

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

Map实现了IDrawable。我调用Draw()并将其自身绘制为0,0这很好。

但是,我想扩展它以基本上绘制视口。玩家将在中间的屏幕上绘制,因此我想在每个方向上显示10个图块(而不是整个地图)。

我在思考这个架构时遇到了麻烦。事情本应该吸引我自己的心态,即我说的是player1.Draw()并且它会吸引自己。这之前会有效,它会在屏幕上以x,y的形式绘制玩家,但是在视口中它将不再知道在哪里绘制自己。

那么视口应该被告知绘制,并检查游戏中的每个对象并绘制那些可见的对象?地图图块应该是受此影响的对象吗?或者视口是否应该通过将两者结合在一起来智能地绘制地图?

我很想知道典型的滚动平铺游戏如何实现这一目标。

如果重要,我正在使用XNA

编辑添加:你可以进行图形操作,例如尝试HTML渲染方法,在哪里绘制内容,然后返回自己的图形,然后父级将图形放在正确的位置?我在想,如果我有两个并排的视口用于分屏,我怎么能阻止他们在边缘外画?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

可能的设计:

  1. 有一个包含对象实例的2D“世界”。
  2. “对象实例”是一个精灵参考+它在世界上的坐标。
  3. 绘制场景时,请求给定2D区域中存在的可见对象列表,然后绘制它们。
  4. 有了这样的设计,世界可能会非常巨大。

      

    我的心态是事物应该自我画出,即我说的是player1.Draw()并且它自己画出来。

    可见事情应该吸引自己。视口外的对象不可见。

      

    ,我怎么能阻止他们在边缘外画画?

    不确定XNA,但OpenGL有“剪刀测试”/“glViewport”,Direct3D 9有“SetViewport”方法,允许你使用部分屏幕/窗口进行渲染。还有clipplanes和模板缓冲区(虽然使用模板进行2D裁剪是过度杀伤)你也可以渲染到纹理然后渲染纹理。有很多方法可以解决这个问题。

      

    那么视口应该被告知绘制,并检查游戏中的每个对象并绘制那些可见的对象?

    对于一个大世界,你不应该检查每个对象,因为它会很慢。您应该能够找到可见对象而无需测试每个对象。为此,你需要某种空间分区 - 四叉树(因为我们是2D),kd树等。这样你应该能够处理几千(甚至几十万)个对象,只要你没有立刻看到它们。

      

    地图图块是否应该是受此影响的对象?

    如果你继续画隐形物,FPS会掉落。

      

    他们会返回自己的图片

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