C#服装系统用于角色

4
我正在尝试为我的游戏角色创建一个灵活的服装系统。目前,我已经有了一个基类,所有子类将从中继承,并添加接口来确定它们实际上穿在哪些身体部位上。以下是我的代码:
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接口的内容,因此这种做法并不好用。是否有一种方法可以将接口实现限制在特定类型中?我不想将我的接口转化为类,因为我希望一件衣服(比如长袍)可以覆盖整个身体(实现所有四个接口)。我有些迷茫,不知道最好的做法是什么,非常感谢任何意见。谢谢。


这些特定的服装接口是添加特定功能还是纯粹作为描述性的意图? - Reddog
你能展示一下你打算如何使用这些 IClothing 对象吗?我不确定它们为什么需要成为不同的类型。 - Joshua Evensen
3个回答

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]属性,这样你就可以这样做:
[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; 

etc.


+1 给我。我特别喜欢 Appeal 属性,可能是我在 RPG 中找不到约会对象的原因。我一直认为全套 Daedric 盔甲很酷。 - Moo-Juice
谢谢,这是个好主意。我之前不知道flags的存在 =) - pajm

1
与其按服装类别分离接口,如其他人所指出的那样,让每件服装都表明它是什么(头饰、长袍等)可能更有帮助。虽然这种方法通常在面向对象编程中不受欢迎,但可能没有太多适用于一种服装类型而不能应用于其他服装类型的方法(即使在某些情况下,效果可能是“无动作”)。例如,如果有一个方法“AnimateResponseToHeadMovement”,“TopHat”实际上可能会做些什么,而“LeftSock”则不会,但“LeftSock”的行为仍将被定义得很好。请注意,广泛定义操作将允许出现这样的情况,即例如必须根据手臂运动来动画显示人的帽子,因为它悬挂得特别低。如果“IHeadWear”接口中不存在“AnimateResponseToArmMovement”方法,则可能无法进行此类响应。
我怀疑一个更大的问题将是定义衣服之间应该如何互动。您可能需要定义一个“CanBeWornInCombinationWith”方法,它接受一组衣服并报告是否存在任何冲突。还可以定义每件衣服所需的“资源”列表,并确认是否有足够的“资源”来穿戴所有请求的衣服。请注意,如果某些衣服对其所需的资源更加挑剔(例如,有些只能穿在右手上,而其他一些则可以穿在任何一只手上),则此方法可能会有些复杂。即使定义一个允许衣服找出组合是否可穿的接口也是一个挑战。
在设计接口之前,我建议您弄清楚自己真正想做什么;您需要多灵活才能允许不同类型的衣服之间进行交互,以及这些衣服应该具备哪些功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接