2015-05-03 44 views
0

我會先說我不知道​​這是否是加載資源的最佳方法,但現在我的資源管理器已將內容提交到LoadContent,然後刷新其資源並將其存儲在列表中。然後,在遊戲代碼中的任何一點,我都可以調用查詢資源,並返回一個我設計爲ResourceBufferElement的類型,該類型在任何給定時間都包含xna的所有可能類型的內容,但其中只有一個不爲null。基於非編譯時間變量的返回類型

所以

//All of this is valid but only .Texture returns a non-null value 
    QueryResource("texture").Texture 
    QueryResource("texture").Model 
    QueryResource("texture").SpriteFont 

那麼是什麼我不知道是如果有對我來說,只是叫QueryResource(「」),並含蓄地返回它所代表的價值的一種方式。

所以我想說

//At LoadContent 
    SubmitResource("texture", typeof(Texture2D)) 
    SubmitResource("model", typeof(Model)) 
//Then at calling I want to say 
    Texture2D tex = QueryResource("texture") 
    or 
    Model mod = QueryResource("model") 
//Instead of saying this 
    Texture2D tex = QueryResource("texture").Texture 
    or 
    Model mod = QueryResource("model").Model 

注:我已經存儲的類型,以便在提交我說

SubmitResource("", typeof(Texture2D)) 
    and ResourceBufferElement keeps the Type for later use 
+0

您可以返回一個* dynamic * – xanatos

+1

爲什麼不只有三種方法,QueryTexture,QueryModel和QuerySpriteFont? –

回答

1

你可以做這樣的事情:

public T QueryResource<T>(string resourceName) 
{ 
    if (T is Texture) 
     return (T)QueryResource(resourceName).Texture; 
    else if (T is Model) 
     return (T)QueryResource(resourceName).Model; 
    else if (T is SpriteFont) 
     return (T)QueryResource(resourceName).SpriteFont; 

    return default(T); 
} 

然後按照你的意願工作:

Texture text = QueryResource<Texture>("Resource"); 
+0

你的方法工作正常,唯一需要chage的是將返回值轉換爲一個對象,然後轉換爲T.必須做return(T)(object)actualResource – mcmonkeyninja

+0

這是因爲你已經存儲在資源管理器中的盒裝值。您需要先明確地投射到一個物體,然後T. –