什麼是在2D XNA遊戲中繪製精靈的有效方法?更具體地說,我把這個問題分成4個問題。最佳實踐:XNA中的高效精靈繪圖
我用來聲明的Game1的spriteBatch 靜態,並在每一個IDrawable.Draw
稱爲SpriteBatch.Begin
和.Close
。那並不好。給每個可繪製的它自己的SpriteBatch也不能很好地工作。
Q1:我認爲,最好有一個 SpriteBatch實例,只調用開始/關閉一次。它是否正確?
目前,我Game1.Draw
看起來是這樣的:
spriteBatch.Begin();
base.Draw(gameTime); // draws elements of Game.Components
// ...
spriteBatch.End();
Q2:這樣一來,Begin
只調用一次。這是要走的路嗎?你們是如何解決這個問題的?
Q3:此外,每個組件都有它自己的IGameComponent.LoadContent
方法。我應該在那裏加載我的內容?或者,是否更好地加載父級的內容,如Game1.LoadContent
?
我知道我不應該加載相同的內容兩次,所以我給我的繪製組件同時使用靜態和非靜態Texture2D
,並給了他們2層構造:
static Texture2D defaultTexture;
public Texture2D MyTexture;
public Enemy()
: this(defaultTexture) { }
public Enemy(Texture2D texture)
{
MyTexture = texture;
}
protected override void LoadContent()
{
if (MyTexture == null)
{
if (defaultTexture == null)
{
defaultTexture = Content.Load<Texture2D>("enemy");
}
MyTexture = defaultTexture;
}
}
這方式,一個類的默認紋理僅在該類第一次調用LoadContent
時被加載。但是,當在構造函數中指定參數texture
時,我必須事先加載該紋理。
Q4:我認爲應該有更好的方法來做到這一點。我正在考慮用他們的資產名稱作爲字符串來創建一個紋理字典。你會建議什麼?
我做的同樣的方式。如果我沒有理由使用乘法精靈批處理(例如,對於分屏,不同效果等),我只在主類遊戲中調用開始和結束一次,並在該開始和結束之間繪製所有內容。 – Thaven