【问题标题】:SpriteBatch not drawing to screenSpriteBatch 未绘制到屏幕上
【发布时间】:2012-12-05 22:40:32
【问题描述】:

当游戏重置但 spritebatch 未绘制时,我正在尝试在屏幕上绘制一个快速加载精灵。我在 game.spritebatch.begin(); 上放了一个断点,当我逐步完成时,什么也没有画出来。有什么想法吗?

这是我的重置功能

public void Reset()
{
    loadingScreen = game.Content.Load<Texture2D>("Textures\\loadingScreen");
    game.spriteBatch.Begin();
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f);
    game.spriteBatch.End();
    cameraPosition = original_cameraPosition;
    players.Clear();
    furthest = 0;
    enemies.Clear();
    LoadEnemies();
    ActivatePlayers();
}

【问题讨论】:

  • 你有没有注意到,当Reset()开始调用时,你的加载纹理只会显示在一帧中?
  • Niko 是对的 - 您的加载时间是否足够长,以至于您的加载屏幕会显示足够长的时间让您真正看到它?在它被游戏循环中的绘图所取代之前?如果您在 Update 方法中调用 SupressDraw,您可以防止游戏循环自己绘制任何东西 - 这将允许您诊断是否发生这种情况。
  • 添加 game.GraphicsDevice.Present() 后,它会绘制一个紫色屏幕,并且持续时间足以显示屏幕一秒钟。此外,如果我在添加 present 之前在 spritebatch.End() 之后放置了一个断点,它不会显示任何内容(意味着它没有绘制)。现在它显示为紫色。

标签: xna spritebatch


【解决方案1】:

您可能没有在正确的位置轮询它。纹理重置(loadingScreen = game.Content.Load&lt;Texture2D&gt;("Textures\\loadingScreen")只能执行一次,否则会造成大量资源浪费。

另一方面的渲染代码:

    game.spriteBatch.Begin();
    game.spriteBatch.Draw(loadingScreen, Vector2.Zero, null, Color.Black, 0.0f, Vector2.Zero, 0.5f, SpriteEffects.None, 0f);
    game.spriteBatch.End();

这需要不断轮询,否则它只会呈现几毫秒,之后您将无法看到它。将渲染代码放入渲染方法中应该可以正常工作。

【讨论】:

  • 实际上对Content.Load 的后续调用将返回在原始调用中加载的相同实例。所以实际上并没有那么糟糕。
  • 即使是这样,它的做法也很糟糕。用其他语言做类似的事情肯定是吃资源的好方法,所以最好不要这样做,因为肯定没有必要。
  • 确实如此。虽然在这个特定的情况下——它只是一个加载屏幕(并且知道 XNA 的内容管理器会缓存)——但我还是会通过它,因为它可以保存在其他地方跟踪纹理。跨度>
  • @AndrewRussell 谢谢我以后要记住这一点。这只是该人可能面临的问题的旁注,他很可能使用我们的任何一种解决方案来解决这个问题:)
  • 在加载完成之前不会调用其他绘图。这就是为什么我只称它一次。
【解决方案2】:

您是否尝试过使用Color.White

【讨论】:

  • 是的,没有什么不同。
【解决方案3】:

在默认配置中,XNA 使用双缓冲。您的所有绘制命令都在执行 - 但结果被绘制到 backbuffer。您需要将其与 frontbuffer 交换,以便结果出现在屏幕上。

通常这是为您完成的。游戏将循环调用UpdateBeginDrawDrawEndDraw(这些是来自Game 的方法,您可以在自己的游戏类中覆盖这些方法)。 EndDraw 的默认实现将调用 GraphicsDevice.Present,这将交换缓冲区。

我的印象是,作为一个加载屏幕,你是在主游戏循环之外的某个地方绘制的。您可以自己调用GraphicsDevice.Present 来翻转缓冲区。

其他一些提示:

  • 您可以通过覆盖BeginDraw 并返回false 来做相反的事情- 并防止XNA 自动绘制。或致电SupressDraw。 (或者您可以通过覆盖 EndDraw 而不调用 base 方法来阻止交换。)

  • SpriteBatch,默认情况下,将缓冲所有绘图,直到调用End。之后拨打您的Present 电话。

【讨论】:

  • 这可以让一些东西绘制到屏幕上,但它不会绘制我的纹理。它只是显示一个紫色屏幕。
  • @jmack20093 紫色屏幕是“新分配的缓冲区”颜色(表示没有绘制任何内容)。不太确定为什么会发生这种情况。渲染目标有时会让人绊倒——但你没有使用它们,对吧?也许你的精灵有问题? (我想它可能是完全透明的。)您可以尝试GraphicsDevice.Clear 来尝试确定绘图是否真的在您期望的时候发生。 Clear 后跟 Present 应该让您更改屏幕颜色 - 诊断问题的良好起点。
  • 使用 clear 确实改变了颜色。可能是在幕后Draw() 中调用了可能导致问题的东西吗?游戏是 3D 的,所以我经常在 2D 和 3D 绘图之间切换,但 UI 在 Draw() 中使用与 Reset() 相同的方法绘制得很好。
  • @jmack20093 SpriteBatch 可能会导致 3D 绘图出现问题。但不是反过来。默认的 SpriteBatch.Begin 应该重置 2D 所需的设置。我已经用PresentEnd 应该 之后进行了一些测试 - 以及您发布的代码。所以这里正在发生其他事情。你能用一个新的 XNA 项目重现这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多