2013-07-23 23 views
0

我工作的一個遊戲,我有可用字符每個玩家從選擇的列表,每個字符包含(3D)模式並已通過裝載在的Texture2D圖標內容管道。XNA - 複製模型

問題是,我想讓多個玩家選擇相同的字符,但player1Char = charDatabase[choosenChar];僅供參考,所以任何重複選擇都會引用同一個模型。

這裏是我想複製的Character類的構造函數,CModel類只是一個模型,帶有該模型的位置,旋轉和縮放值。

public Character(CModel model, string name, int HP, Vector2 iconPositionOnSheet) 

我想我要做的是做一個該類的深層副本,但Model類不可序列化。我能想到的唯一方法是從Content.Load文件中加載相同的模型(如果選擇重複),但我想知道是否有方法可以簡單地複製字符類以及模型,因爲那對我來說會更容易。

+0

除非你正在改變幾何,否則不要複製模型,引用它。資產消耗了大量的內存,除非在非常有限的情況下,否則不應該進行深度複製。 – ClassicThunder

回答

0

而不是將模型對象傳遞給構造函數,而是傳遞模型的ContentManager對象(內容)和文件名字符串。然後在構造函數的主體中,調用Content.Load<Model>(filename)。然後,如果您想給它一種替代顏色或紋理,請克隆basicEffect並使用您想要該角色具有的紋理/顏色進行重置,然後對其進行設置。

現在一個新的模型對象將被分配到其他類似模型的堆(實例化)的其他地方,因此兩個玩家都可以擁有一個唯一的對象。

內容管理器所做的一件聰明事情就是重用GPU資源,如果它們已經被加載的話。因此,如果再次加載模型,雖然它爲您提供了有關C#的堆的唯一引用,但兩個Model對象都將使用相同的頂點緩衝區和效果,因此它們不必實例化兩次。

+0

謝謝史蒂夫,這比我所做的要好,但這並不是我想要的,因爲在那個階段,我已經創建了所有的角色,我創建了每個角色,並將它們放入列表中,因爲它們都顯示在播放之前的角色選擇屏幕中。 所以,只需像'player1Char = characterList [selected]'這樣的東西做一個深層複製就容易了,但我不確定這樣的事情是否可以用Model來完成。 – user1693188

+0

我不認爲位置,比例,旋轉屬於Cmodel類。這些屬性對玩家來說是獨一無二的,而不是模型。例如,下面是兩個使用相同模型但具有不同紋理,比例,位置和旋轉的玩家的示例。遊戲課程:http://pastebin.com/phNbCELH,這裏是玩家課程:http://pastebin.com/FSb09tp1雖然bill&joe都使用相同的模型參考,但它會在場景中的不同位置繪製紋理並且避免佔用不必要的資源。 –

+0

好吧,我不知道,我認爲它就像紋理,這不工作,我不認爲。 知道我可以用一種感覺更清潔的方式來處理這個問題,非常感謝! – user1693188