Как должны обрабатываться ситуации полу-среднего человека? - PullRequest
0 голосов
/ 30 июня 2018

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

У меня есть 3 класса: Engine, EngineList и Resources. Двигатели «производят» определенный тип ресурсов, EngineList (очевидно) хранит и обрабатывает список различных двигателей. А Ресурсы - это единый ресурс, который управляет всеми ресурсами Ресурсы содержат один частный статический EngineList среди других переменных для других типов ресурсов. Другие классы действительно имеют доступ только к ресурсам, и если они получат доступ к EngineList, это будет сделано через ресурсы.

Многие вызовы в Ресурсах, касающиеся двигателей, являются просто вызовами одной и той же точной функции EngineList. В качестве примеров:

public float getEnergyCost(string id)
{
    return energyEngines.getCost(id);
}

public int getEnergyAmount(string id)
{
    return energyEngines.getNum(id);        
}

... и единственный когда-либо экземпляр EngineList будет происходить из ресурсов.

Проблема в том, что в EngineList все еще есть другие задания. Задания, которые (на мой взгляд) больше подходят для чего-то, что объединяет всех производителей одного типа ресурса , а не для работы чего-то, что обрабатывает всех типов ресурсов . (В качестве примера они включают суммирование общего объема производства двигателей, хранение констант для всех идентификаторов двигателей и т. Д.)

своего рода TL; DR:

В данный момент Resources является своего рода посредником в том, что касается вызова этих методов для других классов, но в EngineList по-прежнему есть другие задания (и, в конечном счете, общая задача, отличная от ресурсов). Прямо сейчас это то, что я понимаю как варианты.

  1. Поглощение функциональности EngineList в ресурсы
  2. Сделать EngineList подклассом ресурсов (хотя я не уверен, что это изменит проблему)
  3. Сделайте EngineList одиночным (в отличие от частной статики ресурсов), и классы Resources и Other будут иметь к нему прямой доступ
  4. Оставь как есть

Хотя я не уверен, что правильно, здесь явно пахнет, но я точно не знаю. Последний вопрос, как бы справиться с ситуацией полу-среднего человека и почему?

ПРИМЕРНЫЙ КОД:

public class Engines {

//does enginey things

}    

EngineList aka EnergyEngines

public class EnergyEngines {

    public const string STOMPER_ID = "Stompers";
    public const string JUMPER_ID = "Jumpers";

    Dictionary<string, Engine> engines;

    float productionSum;

    public EnergyEngines()
    {
        productionSum = 0;
        engines = new Dictionary<string, Engine>();
        engines.Add(STOMPER_ID, new Engine(STOMPER_ID, .15f, 1f, 1.3f));
        engines.Add(JUMPER_ID, new Engine(JUMPER_ID, 10f, 2.7f, 5f));
    }

    public float ProductionSum
    {
        get { return productionSum; }
    }


    public bool tryPurchase(string id)
    {
        Engine e = engines[id];
        if (e != null)
        {
            if(e.NextCost <= Resources.Res.Energy+.01f)
            {
                Resources.Res.Energy -= e.NextCost;
                e.Amount++;
                recalculateProduction();
                return true;
            }
        }
        return false;
    }

    void recalculateProduction()
    {
        productionSum = 0;
        foreach (Engine e in engines.Values)
        {
            productionSum += e.TotalProduction;
        }
    }

    public float getCost(string id)
    {
        Engine e = engines[id];
        if (e != null)
        {
            return e.NextCost;
        }
        return float.MaxValue;
    }

    public int getNum(string id)
    {
        Engine e = engines[id];
        if (e != null)
        {
            return e.Amount;
        }
        return -1;
    }
}

Ресурсы:

public class Resources : MonoBehaviour
{
    const int playerIncrement = 1;

    private static Resources instance;

    public static Resources Res { get { return instance; } }

    private static EnergyEngines energyEngines;

    public float Energy { get; set; }

    Resources()
    {
        Energy = 0;
        energyEngines = new EnergyEngines();

    }

    // Use this for initialization
    void Awake()
    {
        if (instance == null)
        {
            instance = this;
        }    
    }

    void FixedUpdate()
    {
        Energy += energyEngines.ProductionSum * Time.fixedDeltaTime;
    }

    void Update()
    {
        HUDManager.Hud.updateEnergyText();
    }

    public void tapEnergy()
    {
        Energy += playerIncrement;
    }

    public bool tryEnergyPurchase(string type)
    {

        if (energyEngines.tryPurchase(type))
        {
            HUDManager.Hud.updateWorkerInfo();
            return true;
        }
        return false;
    }

    public float getCost(string id)
    {
        return energyEngines.getCost(id);
    }

    public int getAmount(string id)
    {
        return energyEngines.getNum(id);        
    }

    // ... other things with other resources,

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