有没有其他方法可以避免重绘第二个视口?

时间:2013-01-28 14:14:57

标签: c# xna camera draw viewport

我必须添加第二个视口(=类似于分屏),以允许玩家在当前级别的其他位置查看事件。

是否有可能绘制事件区域而不重绘已绘制的所有内容?

[编辑] RenderTarget2D是关键。 Thx User1459910适用于所有人。

它几乎奏效了。

新问题:

  1. 我已经搜索了一段时间但仍然找不到关于“Xna 2D相机带源和目标矩形”的教程如果你有链接,我想看看它,请♥
  2. 目前,绘图代码如下所示:

    protected override void Draw(GameTime gameTime)
    {
    
       /*
       ...
       here is the code to "draw" in the renderTarget2D renderAllScene object
       ...
       */
    
       //Let's draw into the 2 viewports
       spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, null, null, null, camera1.transform);
       spriteBatch.Draw(renderAllScene, viewport1.Bounds, Color.White);
       spriteBatch.End();
       if (EventIsRunning)
       {
          spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, null, null, null, camera2.transform);
          spriteBatch.Draw(renderAllScene, viewport2.Bounds, Color.White);
          spriteBatch.End();
       }
    
  3. * Viewport 1很棒。相机跟随角色,但在移动相机一小段距离后,我认为地图切割为1280像素。所以它只绘制了所有地图的1280个像素。我不知道为什么。也许是因为我在创建renderAllScene = new RenderTarget2D时失败了。 :X

            renderAllScene = new RenderTarget2D(GraphicsDevice, GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight);
    

    *对于视口2:我需要源矩形。我明天会试试。

1 个答案:

答案 0 :(得分:1)

我会假设你正在制作一部没有3D的2D游戏。

以下是您可以做的事情:

您需要在纹理上渲染整个地图以及出现在其上的所有游戏对象。如果您不知道如何渲染到纹理,请执行以下步骤:

  1. 创建RenderTarget2D对象
  2. 在Draw函数中,在渲染任何内容之前,必须调用graphicsDevice.SetRenderTarget()方法,并设置您创建的RenderTarget2D。
  3. 完成渲染后,调用graphicsDevice.SetRenderTarget(null)将渲染目标重置为默认目标。你必须这样做,否则你会遇到问题!
  4. 要渲染RenderTarget2D,只需使用SpriteBatch.Draw((Texture2D)renderTarget2D,position,color),当然是“renderTarget2D”您创建的RenderTarget2D的名称。
  5. 然后,您使用两个2D相机。一个将显示英雄的位置,另一个将显示事件区域。

    2D相机基本上是源和目标矩形的技巧。诀窍是使用源矩形来定义显示英雄及其周围区域的区域,并使用主视口作为目标矩形,并使用另一个源矩形来定义事件区域,使用另一个目标矩形作为第二个视口。

    如果您有疑问,请关注“XNA 2D相机”,并在MSDN的SpriteBatch.Draw()文章中研究源和目标矩形。