【问题标题】:is there any other way to avoid redrawing for the 2nd viewport?有没有其他方法可以避免重绘第二个视口?
【发布时间】:2023-03-10 23:18:01
【问题描述】:

我必须添加第二个视口(= 像分屏一样)以允许玩家在当前关卡的其他地方看到事件。

有没有可能在不重新绘制所有已经绘制的东西的情况下绘制活动区域?

[编辑] RenderTarget2D 是关键。感谢所有的 User1459910。

几乎成功了。

新问题:

  1. 我找了一阵子还是没有找到“Xna 2D camera with source and destination rectangle”的教程,如果有链接,我想看看,请♥
  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();
       }
    

*Viewport 1 很棒。相机跟随角色,但在将相机移动一小段距离后,我认为地图被切割为 1280 像素。所以它只绘制了所有地图的 1280 像素。我不知道为什么。也许是因为我在创建 renderAllScene = new RenderTarget2D 时失败了。 :x

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

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

【问题讨论】:

  • 有人说您实际上可以移动视口而不是移动世界上的所有对象,尽管我自己还没有尝试过。我想基本上你需要找出在两个视口中都可以看到哪些对象,用 spritebatch 将它们全部绘制出来,然后用你的视口做一些事情。或者为第一个视口绘制东西,然后为另一个视口绘制东西,我不确定。

标签: c# xna camera draw viewport


【解决方案1】:

我假设您正在制作一款完全没有 3D 元素的 2D 游戏。

你可以这样做:

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

  1. 创建 RenderTarget2D 对象
  2. 在 Draw 函数上,在渲染任何东西之前,您必须调用 graphicsDevice.SetRenderTarget() 方法,并设置您创建的 RenderTarget2D。
  3. 完成渲染后,调用 graphicsDevice.SetRenderTarget(null) 将渲染目标重置为默认值。你必须这样做,否则你会遇到问题!
  4. 要渲染 RenderTarget2D,只需使用 SpriteBatch.Draw((Texture2D)renderTarget2D, position, color),“renderTarget2D”当然是您创建的 RenderTarget2D 的名称。

然后,您使用两个 2D 相机。一个显示英雄所在的位置,另一个显示活动区域。

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

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

【讨论】:

  • 感谢您的回答!我有点累,英语不太好(所以明天我会重新阅读你的答案)。这里有更多信息:1-这是一个 2D 游戏,但 2-我使用的是矩阵(使用 Vector3),你的答案仍然有效吗?
  • 您使用 Matrix 做什么?您的意思是 SpriteBatch.Begin() 上的转换矩阵?如果是,如果您正确考虑源矩形的位置和尺寸,我的回答仍然有效。
  • 是的,在 spritebatch.begin() 中使用的相机矩阵变换。谢谢很多,我会在几个小时内试试这个♥
  • 那么,你应该知道矩阵会变换目标矩形的位置和尺寸(但源矩形无论如何都不会变换)。请注意,如果在绘图调用上使用不同的原点和旋转,目标矩形的位置将会搞砸!
  • 嗯,我觉得这有点棘手,因为我已经为阴影和灯光使用了 RenderTarget2D(我必须在第二个视口中重新显示阴影和灯光),但我尝试了一些东西但没有成功...我编辑了有关我的绘图代码的更多信息。希望您仍然可以提供帮助。
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 2021-09-06
  • 2012-06-28
  • 2011-04-25
  • 2021-12-19
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多