我一直在努力解决这个问题。
目前,我有一个100乘100的网格,属于地图。
Map实现了IDrawable。我调用Draw()并将其自身绘制为0,0这很好。
但是,我想扩展它以基本上绘制视口。玩家将在中间的屏幕上绘制,因此我想在每个方向上显示10个图块(而不是整个地图)。
我在思考这个架构时遇到了麻烦。事情本应该吸引我自己的心态,即我说的是player1.Draw()并且它会吸引自己。这之前会有效,它会在屏幕上以x,y的形式绘制玩家,但是在视口中它将不再知道在哪里绘制自己。
那么视口应该被告知绘制,并检查游戏中的每个对象并绘制那些可见的对象?地图图块应该是受此影响的对象吗?或者视口是否应该通过将两者结合在一起来智能地绘制地图?
我很想知道典型的滚动平铺游戏如何实现这一目标。
如果重要,我正在使用XNA
编辑添加:你可以进行图形操作,例如尝试HTML渲染方法,在哪里绘制内容,然后返回自己的图形,然后父级将图形放在正确的位置?我在想,如果我有两个并排的视口用于分屏,我怎么能阻止他们在边缘外画?
答案 0 :(得分:2)
一些基本的想法,不是专门针对XNA的:
答案 1 :(得分:2)
可能的设计:
有了这样的设计,世界可能会非常巨大。
我的心态是事物应该自我画出,即我说的是player1.Draw()并且它自己画出来。
可见事情应该吸引自己。视口外的对象不可见。
,我怎么能阻止他们在边缘外画画?
不确定XNA,但OpenGL有“剪刀测试”/“glViewport”,Direct3D 9有“SetViewport”方法,允许你使用部分屏幕/窗口进行渲染。还有clipplanes和模板缓冲区(虽然使用模板进行2D裁剪是过度杀伤)你也可以渲染到纹理然后渲染纹理。有很多方法可以解决这个问题。
那么视口应该被告知绘制,并检查游戏中的每个对象并绘制那些可见的对象?
对于一个大世界,你不应该检查每个对象,因为它会很慢。您应该能够找到可见对象而无需测试每个对象。为此,你需要某种空间分区 - 四叉树(因为我们是2D),kd树等。这样你应该能够处理几千(甚至几十万)个对象,只要你没有立刻看到它们。
地图图块是否应该是受此影响的对象?
如果你继续画隐形物,FPS会掉落。
他们会返回自己的图片
对于2D游戏,这可能会非常慢。记住KISS原则。