2011-12-09 34 views
4

我正在嘗試在我的遊戲中創建一個靈活的服裝系統。現在我已經有了一個基礎班,所有的童裝班都將從這個基礎班擴展而來,還有額外的界面可以將他們實際穿着的身體部位帶入方程式。這裏是我的代碼:C#人物服裝系統

public class Clothing 
{ 
    public EClothingBind[] Types; 
    public int ID; 
    public int Priority; 
    public bool HidesUnderlying; 
    public AnimatedSpriteMap Graphic; 
    public Color Blend = Color.White; 

    public virtual void Update(GameTime gameTime) 
    { 
     Graphic.Update(gameTime); 
    } 

    public virtual void Draw(Vector2 position) 
    { 
     Graphic.Tint = Blend; 
     Graphic.Draw(position); 
    } 
} 

public interface IClothingHead { ... } 
public interface IClothingChest { ... } 
public interface IClothingLegs { ... } 
public interface IClothingFeet { ... } 

眼下這並不能很好的工作,因爲設計並沒有真正限制什麼可以實現我的IClothing接口。有沒有辦法將接口實現限制到某些類型?我不想把我的界面變成類,因爲我想要一件衣服,比如說一件長袍,來覆蓋整個身體(實現全部四種)。我有點失落,最好的方式是做什麼,所有的輸入都非常感謝。謝謝。

+0

特定的服裝界面是否添加了特定的功能或純粹用於描述? – Reddog

+0

你能說明你打算如何使用這些IClothing物體嗎?我不確定他們爲什麼需要成爲不同的類型。 –

回答

6

我認爲你正在爲這個方法面臨一些艱難的時刻。當然,一件長袍可以涵蓋所有的部分,而且它可能會影響4個區域的「護甲」值。但像這樣執行它看起來非常麻煩。你可能只需要一個IClothing接口,並有一些可以放在哪裏的標識(例如:Hands/Feet等)。傳統上,長袍通常是胸部,但圖形上他們覆蓋整個角色。

enum PositionType 
{ 
    Head, 
    Chest, 
    Hand, 
    Feet, 
    Finger, 
    Neck 
} 


public interface IClothing 
{ 
    PositionType Type { get; } 
    // Other things you need IClothing-classed to implement 
} 

我認爲這可能是一個更好的辦法,而不是試圖微調正是身體部分的服裝的特定項目不通過實現多個接口的方式。

3

這擴展了moo-Juice的答案(只是不把它放在評論中,因爲格式不允許)。

你可以有你PositionType具有屬性[國旗]所以你可以做:

[Flags] 
enum PositionType 
{ 
    Head, 
    Chest, 
    Hand, 
    Feet, 
    Finger, 
    Neck 
} 

Armor robe = new Armor(); //sure why not. 
robe.ArmorValue = 125.3; 
robe.Appeal = 100;  
robe.PositionType = PositionType.Chest | PositionType.Arms | PositionType.BellyButton; 

+0

+1。我特別喜歡「Appeal」屬性,可能是我無法在RPG中獲得約會的原因。我一直認爲全身盔甲是熱的東西。 –

+0

謝謝,這是一個好主意。我現在不知道標誌=) – pajm

1

不是通過類服裝的隔離接口,它可能會更有幫助像其他人那樣注意到每一件服裝都表明它是什麼(頭飾,長袍等)。雖然這樣的方法通常不利於面向對象編程,但是可能沒有很多方法適用於某種不適用於其他類型的服裝(即使在某些情況下,效果可能會是'不行動')。例如,如果有一種方法「AnimateResponseToHeadMovement」,「TopHat」實際上可能會做某些事情,而「LeftSock」則不會,但「LeftSock」的行爲仍然可以很好地定義。注意,相當廣泛地定義動作將允許例如一個人的帽子可能不得不爲響應他們的手臂動作而動畫,因爲它的懸掛特別低。如果IHeadWear接口中不存在「AnimateResponseToArmMovement」方法,則可能無法進行此類響應。

我懷疑一個更大的問題是要定義衣服應該交互的方式。您可能需要定義一個「CanBeWornInCombinationWith」方法,該方法會獲取衣服列表並報告是否存在任何衝突。也可以定義每件衣服所需的「資源」列表,並確認有足夠的「資源」來穿所有需要的衣服。請注意,如果某些衣服比其他衣服更需要資源(例如,某些衣服只能戴在右手上,而其他衣服可以戴在其他衣服上),則這種方法可能有點複雜。即使定義了一個能夠讓服裝弄清楚組合是否可以穿的界面也是一個挑戰。

在設計一個接口之前,我建議你弄清楚你真正想要做什麼;你需要在多種服裝類型之間進行互動以及衣服應具備哪些功能。