2012-12-05 55 views
2

我想绘制一个快速加载精灵到游戏重置但spritebatch没有绘制时的屏幕。我在上放了一个断点game.spritebatch.begin();当我一步一步通过任何绘制。有任何想法吗?SpriteBatch没有绘制到屏幕

这里是我的复位功能

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(); 
} 
+2

你有没有注意到你的加载纹理只会在Reset()调用时显示在一帧中? – neeKo

+0

Niko是正确的 - 您的加载时间足够长,您的加载屏幕将保持足够长的时间显示,以便您真正看到它?在通过从游戏循环中绘制替换之前?如果您在'Update'方法中调用'SupressDraw',则可以防止游戏循环自己绘制任何东西 - 这将允许您诊断这是否发生。 –

+0

添加game.GraphicsDevice.Present()后,它会绘制一个紫色屏幕,并持续足够长的时间以显示屏幕一秒钟。另外,如果我在添加之前在spritebatch.End()之后放置了一个断点,它不会显示任何内容(表示它不是绘图)。现在它显示紫色。 – jmack20093

回答

2

你可能不轮询它在正确的位置。纹理重置(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(); 

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

+2

事实上,对Content.Load的后续调用将返回与原始调用相同的实例。所以这并不是那么糟糕。 –

+1

即使是这样,它的做法很差。在其他语言中做类似的事情是消耗资源的绝对火种,所以最好不要这样做,因为肯定没有必要。 –

+2

这当然是对的。尽管在这个*特殊的情况下 - 它只是一个加载屏幕(并且知道XNA的内容管理器会缓存) - 但我会通过它来保存跟踪其他地方的纹理。 –

2

您是否尝试过使用Color.White

+0

是的,它没有区别。 – jmack20093

1

在默认配置中,XNA使用双缓冲。你所有的绘图命令正在发生 - 但结果正在被吸引到backbuffer。您需要将其与前台缓存交换,以便结果显示在屏幕上。

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

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

一些其他提示:

  • 你基本上可以做相反的事情 - 和防止XNA从图纸自动 - 通过重写BeginDraw和返回false。或致电SupressDraw。 (或者你也可以防止通过重写EndDraw而不是调用base方法交换。)

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

+0

这可以让东西绘制到屏幕上,但它不绘制我的纹理。它只是显示一个紫色的屏幕。 – jmack20093

+0

@ jmack20093紫色屏幕是“新分配的缓冲区”颜色(表示没有绘制任何内容)。不确定为什么会发生在你身上。渲染目标有时会引起人们的注意 - 但是你并没有使用它们,对吧?也许你的精灵有什么问题? (我想它可能是完全透明的。)你可以尝试'GraphicsDevice.Clear'来试图确定当你期望的时候绘图是否真的发生。 'Clear'后面跟着'Present' * *应该*可以让你改变屏幕的颜色 - 一个诊断问题的好起点。 –

+0

使用清除确实改变了颜色。难道是在幕后的'Draw()'中调用了可能导致问题的东西吗?游戏是3D的,所以我经常在2D和3D绘图之间切换,但用户界面在'Draw()'中使用与Reset()'相同的方法绘制得很好。 – jmack20093