2014-03-12 168 views
0

假設您有一個繼承DrawableGameComponent的ScreenManager和一個繼承GameScreen的GamePlayScreen。 GamePlayScreen通過ScreenManagers ContentManager繪製,其功能與Game1.cs一樣。而其LoadContent樣子:將對象加載到另一個類的列表中XNA C#

public override void LoadContent() 

if (content == null) 
content = new ContentManager(ScreenManager.Game.Services, "Content") 

foreach (Objects object in objects) 
    object.LoadContent(); 

和對象類調用相同LoadContent方法,但當然說object = content.Load<Texture2D>(" - "); ...我得到的錯誤:

"content = new ContentManager(ScreenManager.Game.Services, "Content") - 未設置爲對象的實例引用一個對象「在我的對象類LoadContent方法中

有沒有辦法從對象類調用GamePlayScreen的內容或ContentManager? ++++++++++++++++++ +++++

好吧,我已經意識到問題到底是什麼。我正在使用GameStateManagement Sample的邏輯,「由Xbox Indie Games的頭部技術創建」,它本身就是精彩的代碼......如果你只是在製作主菜單......大聲笑...

但是,ScreenManager是DrawableGameComponent,它的GameScreen列表使它成爲並說屏幕是遊戲中唯一有效的東西。或者可能只有屏幕是,並且當它們轉換到屏幕管理器被調用時,喚醒,增加新的屏幕並再次進入睡眠。

因此不允許您調用任何類,對象名單的,或者包含在另一個類東西......

現在,人們可能會想到,只需要創建一個新的ScreenManager2 : DrawableGameComponent,或者甚至一個ObjectManager : DrawableGameComponent ....啊ahhh,已經擊敗你的朋友.....

創建一個新的ObjectManager允許你的對象被繪製在你原來的ScreenManager處理的所有東西上......真正的......包括你的PauseScreen和PauseMenu ..垃圾!

並且在您提及ScreenManager2之前,它處理PauseScreen和PauseMenu,並嘗試過。我成功地操作了所有的代碼,直到ScreenManager選擇Play來告訴LoadingScreen功能,然後調用GamePlayScreen ...

這導致Asik正確,我的內容是空的,因爲我無法弄清楚方式爲我的對象類/類被調用和初始化與此代碼的工作方式。

導致我問正確的問題...

你怎麼調用類初始化,只是足夠長的時間讓LoadContent在GamePlayScreen聚集說類/對象信息,將其放在其對象列表?

雷曼的條款:「LoadContent函數上的GamePlayScreen,喚醒Object1.cs,在你的ObjectList中添加對象信息,告訴Object1.cs進入睡眠狀態,GamePlayScreen繼續你的糟糕自我......」 「

+0

感謝您的編輯說,我在「Not-so-Smart」手機上 –

回答

0

隨着屏幕管理的複雜性,我發現沒有辦法直接從Object1類加載的內容,我卻能夠調用的對象處理舊的形式:

在Object1類.. 。

Texture2D image; 

public Object1(Texture2D texture) 
{ 
    this.image = texture; 
    //other information... 
} 

即使SpriteBatch是從來沒有在對象類中聲明,我能叫:

public override void Draw(SpriteBatch spriteBatch) 
{ 
    spriteBatch.Draw(image, Rectangle, Color.White); 
} 

而且在GamePlayScreen的LoadContent:

Texture2D tempImage = content.Load... 
objectList.Add(new Object1(tempImage)); 

然後在其中呼籲GamePlayScreen的Draw函數GameTime,我打電話:

foreach (Objects object in objectList) 
    object.Draw(spriteBatch); 

2天后KS之後,這次終於要解決了,我還引用自己:

「這一切看起來那麼容易,直到你誰需要弄明白的一個......」

+0

我感謝你們試圖幫助,這是非常感謝:-) –

0

」對象引用未設置爲對象的實例「爲NullReferenceException:這意味着您試圖從當前爲null的變量中訪問某些內容。在您發佈的帖子上,我看到兩種可能性:ScreenManager.Game爲空,或ScreenManager.Game.Services爲空。爲什麼?因爲在這行被調用的時候你沒有初始化它們。

這就是說,爲什麼不通過ContentManager,無論什麼類需要它,而不是實例化新的?

+0

我不確定如何傳遞ContentManager。我模仿的對象類就像ScreenManager添加新的屏幕一樣,這些類甚至沒有Initialize方法。我認爲調用Object.Add(new object());'只會複製對象信息的副本,除非它的確如​​此,並且您的意思是在複製之前需要初始化信息。好吧,我會嘗試添加一個初始化方法到對象類。 –

+0

最簡單的事情就是在你的Game類上創建一個公共靜態屬性「ContentManager」,並在啓動時初始化它。然後每個其他類都通過Game.ContentManager進行訪問。 – Asik

+0

是的,我認爲它是因爲所有的東西都在ScreenManager上運行,因爲它繼承了DrawableGameComponent。它的加載方法說'ContentManager內容= Game.Content;'。好吧,我會做一個靜態的,並希望這不會干擾ScreenManagers shenanigans ... –

1

您正在使用GameComponentDrawableGameComponent。你的子類,從這些繼承必須通過他們的GameComponent.Game特性(也就是說,如果你已經通過它進入它們的構造函數,而不是指定null訪問Game實例。

這是一件好事。只要使用GameComponent。Game.Content訪問。ContentManager每個

相關問題