C#服装系统的角色

时间:2011-12-09 21:32:52

标签: c# inheritance interface

我正在尝试创建一个灵活的系统,在我的游戏中为我的角色服装。现在我已经有了一个基类,所有的儿童服装类都将从这个基类扩展,并有额外的接口将它们实际上所穿的身体部分带入等式中。这是我的代码:

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接口的东西。有没有办法将接口实现限制为某些类型?我不想把我的界面变成班级,因为我想要一件衣服,比如长袍,以覆盖整个身体(实施所有四个)。对于这样做的最佳方式我有点失落,所有的输入都非常感激。感谢。

3 个答案:

答案 0 :(得分: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
}

我认为这可能是一种更好的方法,而不是试图通过实现多个界面来精确调整特定服装项目的身体部位。

答案 1 :(得分:3)

这扩展了moo-Juice的答案(因为不允许格式化,所以不会将其放在评论中)。

您可以让您的PositionType具有[Flags]属性,以便您可以:

[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; 

答案 2 :(得分:1)

不是按服装类别划分界面,而是可能更有帮助,因为其他人已经注意到每件服装都表明它是什么(头饰,长袍等)。虽然这种方法在面向对象编程中通常是不受欢迎的,但可能没有很多方法适用于一种不能应用于其他类型的服装(即使在某些情况下,效果可能也是如此)是'不采取行动')。例如,如果有一个方法“AnimateResponseToHeadMovement”,“TopHat”实际上可能会做某事,而“LeftSock”则不会,但“LeftSock”的行为仍然是明确定义的。注意,相当广泛地定义动作将允许例如其中的情况。一个人的帽子可能需要动画以响应他们的手臂动作,因为它的下垂特别低。如果IHeadWear接口中没有“AnimateResponseToArmMovement”方法,则可能无法进行此类响应。

我怀疑一个更大的问题是定义服装应该如何相互作用的方式。您可能希望定义一个“CanBeWornInCombinationWith”方法,该方法获取服装列表并报告是否存在任何冲突。也可以定义每件衣服所需的“资源”列表,并确认有足够的“资源”来穿戴所有要求的衣服。请注意,如果某些衣服比其他衣服更挑剔他们需要什么样的资源,这种方法可能会有些复杂(例如,一些衣服只能戴在右手上,而其他衣服可以戴在其中任何一个)。甚至定义一个允许服装弄清楚是否可以穿戴组合的界面将是一个挑战。

在设计界面之前,我建议你弄清楚你真正要做的事情;你需要多么多样化才能允许服装类型之间的相互作用,以及服装应具备的功能。