2012-12-05 87 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