C # Система одежды для персонажа - PullRequest
4 голосов
/ 10 декабря 2011

Я пытаюсь создать гибкую систему для одежды моего персонажа в моей игре.Прямо сейчас у меня есть базовый класс, из которого будут расширены все классы детской одежды, и дополнительные интерфейсы, чтобы привести, какие части тела они фактически одевают в уравнение.Вот мой код:

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 ]

6 голосов
/ 10 декабря 2011

Я думаю, вы подходите к трудным временам с этим подходом. Конечно, халат покрывает все, и графически он, возможно, повлияет на значение «брони» 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 голосов
/ 10 декабря 2011

Это расширяет ответ 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 голос
/ 10 декабря 2011

Вместо того, чтобы разделять интерфейсы по классам одежды, это может быть более полезным, поскольку другие отметили, что каждый предмет одежды указывает что-то о том, что это (головной убор, халат и т. Д.).Хотя такой подход обычно не одобряется в объектно-ориентированном программировании, вероятно, существует не так много методов, которые были бы применимы к одному типу одежды, которые нельзя было бы применить к другим (даже если в некоторых случаях эффект можетбыть «без действия»).Например, если бы существовал метод «AnimateResponseToHeadMovement», «TopHat» мог бы действительно что-то делать, а «LeftSock» - нет, но поведение «LeftSock» все равно было бы четко определено.Обратите внимание, что определение действий довольно широко позволит учесть ситуации, в которых, например, может потребоваться анимировать шляпу человека в ответ на движения его руки, потому что она свисает особенно низко.Если бы метод «AnimateResponseToArmMovement» не присутствовал в интерфейсе IHeadWear, такой ответ мог бы быть невозможным.

Большая проблема, которую я подозреваю, заключается в определении способов взаимодействия предметов одежды.Возможно, вы захотите определить метод «CanBeWornInCombinationWith», который берет список одежды и сообщает, есть ли какие-либо конфликты.Также возможно определить список «ресурсов», требуемых для каждого предмета одежды, и подтвердить, что «ресурсов» достаточно, чтобы носить всю запрашиваемую одежду.Обратите внимание, что этот подход может быть несколько сложным, если некоторые вещи более требовательны к ресурсам, чем другие (например, некоторые можно носить только на правой руке, тогда как другие можно носить на любой).Даже определение интерфейса, который позволил бы одежде выяснить, можно ли носить комбинацию, было бы сложной задачей.

Прежде чем можно будет разработать интерфейс, я бы посоветовал вам выяснить, что вы действительно пытаетесьсделать;насколько вы должны быть универсальны для обеспечения взаимодействия между типами одежды и какими функциями должна обладать одежда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...