C#角色服装系统

问题描述 投票:0回答: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 接口。有没有办法将接口实现限制为某些类型?我不想将我的接口变成类,因为我想要一件衣服,比如一件长袍,来覆盖整个身体(实现所有四个)。我有点不知道什么是最好的方法,非常感谢所有的意见。谢谢。

c# inheritance interface
4个回答
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
}

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


4
投票

这扩展了 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; 

等等


1
投票

与其按服装类别隔离界面,不如让每件服装都表明它是什么(头饰、长袍等),这可能会更有帮助。 虽然这种方法在面向对象编程中通常不受欢迎,但可能没有大量方法适用于一种服装而不能应用于其他服装(即使在某些情况下,效果可能会有所不同)为“不采取行动”)。 例如,如果有一个方法“AnimateResponseToHeadMovement”,“TopHat”实际上可能会执行某些操作,而“LeftSock”则不会,但“LeftSock”的行为仍然会被明确定义。 请注意,相当广泛地定义操作将允许以下情况:一个人的帽子可能必须根据他们的手臂动作进行动画处理,因为它挂得特别低。 如果 IHeadWear 接口中不存在“AnimateResponseToArmMovement”方法,则可能无法实现此类响应。

我怀疑一个更大的问题是定义衣服之间相互作用的方式。 您可能想要定义一个“CanBeWornInCombinationWith”方法,该方法获取服装列表并报告是否存在任何冲突。 还可以定义每件衣服所需的“资源”列表,并确认有足够的“资源”来穿着所有请求的衣服。 请注意,如果某些衣服比其他衣服对所需资源更加挑剔(例如,有些衣服只能戴在右手上,而另一些衣服则可以戴在任何一只手上),则这种方法可能会有些复杂。 即使定义一个界面,让服装能够判断组合是否可以穿着也是一个挑战。

在设计界面之前,我建议你先弄清楚你真正想要做什么;您需要多才多艺才能允许服装类型之间的互动,以及服装应该具有哪些功能。


-1
投票

男士 T 恤和衬衫指南:合身、风格和舒适

探索男士 T 恤和衬衫的终极指南,重点关注合身、风格和舒适度。我们帮助您选择适合您体型、偏好和场合的正确选项,确保您始终保持最佳状态。

© www.soinside.com 2019 - 2024. All rights reserved.