2011-12-09 3 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インタフェースを実装することができるものを制限するものではありませんとして今これが、うまく動作しません。インターフェイスの実装を特定のタイプに制限する方法はありますか?インターフェイスをクラスに変えたいとは思わないので、ローブと呼ばれる衣服を身体全体をカバーするようにしたい(4つすべてを実装する)ようにしたい。私はこれをやり遂げる最善の方法は何であるのか分からなくなってしまい、すべてのインプットは高く評価されます。ありがとう。

+0

特定の機能を追加しているのか、まったく説明的なものとして意図しているのか – Reddog

+0

これらのIClothingオブジェクトをどのように使用する予定ですか?なぜ彼らが別のタイプになる必要があるのか​​分かりません。 –

答えて

6

私はあなたがこのアプローチに先立っていくつかの厳しい時を過ごしていると思います。確かに、衣服は全てを覆い、グラフィック的には4つの領域の「防具」値に影響を与え、おそらくそれに影響を与えます。しかし、このように実装するのは非常に面倒です。おそらく、単一のIClothingインターフェイスが必要なだけで、どこに置くことができるかの識別情報がいくつかあります(例:手/足など)。伝統的に、ローブは一般にチェストピースですが、図形的にはキャラクター全体をカバーします。

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"の動作は依然として明確です。むしろ広範に動作を定義することは、例えば、人の帽子は、とりわけ低い吊り下げのため、腕の動きに応じてアニメーション化する必要があります。 "AnimateResponseToArmMovement"メソッドがIHeadWearインターフェイスに存在しない場合、そのような応答は不可能かもしれません。

私が考えているより大きな問題は、衣服が相互作用する方法を定義することです。 "CanBeWornInCombinationWith"メソッドを定義して、衣服のリストを取得し、競合があるかどうかを報告することができます。また、各衣服に必要な「リソース」のリストを定義し、要求されたすべての服を着用するのに十分な「リソース」があることを確認することもできます。このアプローチは、他のものよりも必要なリソース(例えば、一部のみを右手に着用することができ、他の着用者はどちらか一方を着用できるなど)が必要な場合には、やや複雑な場合があります。組み合わされているかどうかを衣服が把握することを可能にするインターフェースを定義することさえ難しいことです。

インターフェイスを設計する前に、実際に何をしようとしているのか把握することをお勧めします。衣類の種類と、その衣服が持つべき機能との間の相互作用を可能にするには、多用途性が必要ですか。

関連する問題