Логика распределения энергии (совсем запутался)

Программирование на Юнити.

Логика распределения энергии (совсем запутался)

Сообщение EagleOwle 19 янв 2017, 16:13

Приветствую. Совсем запутался в алгоритме.
Суть такова.
Один модуль (экземпляр класса) вырабатывает N энергии.
Другие модули при выполнении различных методов потребляют свою часть энергии.
Пользователь может распределять процент потребления энергии между модулями(именно здесь я "туплю").
Может кто поможет (не бесплатно).
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: Логика распределения энергии (совсем запутался)

Сообщение Cr0c 20 янв 2017, 21:53

Минимальный расход энергии у потребителей есть?
Динамическое изменение распределения энергии при добавлении потребителя есть?
При уменьшении процента потребления у остальных увеличивается или в свободную энергии идёт?
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Логика распределения энергии (совсем запутался)

Сообщение Syberex 21 янв 2017, 23:21

Определяем класс например EnergyStation у которого будет 2 простых метода ;)
Выработать() и Потребить() и одна внутренняя переменная количествоЭнергии.
Синтаксис:
Используется csharp
public class EnergyStation
{
    public float generatedEnergy = 100f;
    private float currentEnergy = 0f;

    public void Generate()
    {
        currentEnergy = generatedEnergy;
        //currentEnergy += generatedEnergy;    // так если станция энергию и аккумулирует тоже
    }

    public bool Consume(float requiredEnergy)
    {
        bool result = false;
        if (requiredEnergy <= currentEnergy)
        {
            currentEnergy -= requiredEnergy;
            result = true;
        }
        return result;
    }
}
 


Теперь можно каждый апдейт или по другому таймеру вызывать Generate() - станция выработает энергию,
после чего каждый потребитель также каждый апдейт (или по тому же таймеру) должен вызвать Consume(необходимое кол-во) - чтобы потребить энергию, если нет достаточного количества потребитель отключает свои функции...

При изменении % у модулей потребителей нужно сразу вычислить конечное количество энергии и в алгоритме ничего менять не надо.
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Логика распределения энергии (совсем запутался)

Сообщение EagleOwle 23 янв 2017, 12:40

Все сложнее...
Распределение и потребление работает нормально.
Модули на персонаже (экземпляры класса, наследованные от абстрактного класcа modulBasys) используют энергию в виде float величины EnergyPower
Они имеют максимально возможное значение и PowerEnergy не должно его превышать.
Контролируется это при помощи конструктора
Синтаксис:
Используется csharp
private float energyPower;//Текущее количество энергии
    public float EnergyPower
    {
        get { return energyPower; }

        set
        {
            energyPower = Mathf.Clamp(value, 0, energyMaxValue);
        }
    }
 

Модуль реактор пополняет у них всех значение PowerEnergy поочередно за один цикл
Синтаксис:
Используется csharp
private void ReloadAllEnergy()
    {
        foreach (ModulBasys modul in botController.modulController)
        {
            if (modul.modulStatus == ModulStatus.On)
            {
                EnergyPower -= modul.ReloadEnergy(power);
            }
        }
    }
 


Проблемы и путаница возникает в меню распределения потребления энергии, которое работает с процентами от reactor.power
Т.е. я вызываю меню. В нем обьекты с экземплярами классов UI_ModulEnergy. В эти классы передается ссылка на соответствующие экземпляры классов ModulBasys (которые висят на персонаже) а так же в локальные переменные energyReloadQuoue и energyMaxValue.
Важно то, что energyReloadQuoue это процент от reactor.power а energyMaxValue это конкретная величина.
По нажатии на любой из обьектов UI_ModulEnergy появляется слайдер и можно регулировать процент потребления энергии, Но. Регулировка происходит процентами и ограничения должны быть в конкретной величине.
Ограничение контролируется таким образом
Синтаксис:
Используется csharp
private float energyReloadQuoue; //Процент потребления энергии
    public float EnergyReloadQuoue
    {
        get { return energyReloadQuoue; }

        set
        {
            if (value > 0)
            {
                energyReloadQuoue = Mathf.Clamp(value, 0, (energyMaxValue * 100) / reactorPower);
            }
            else
            {
                energyReloadQuoue = 0;
            }
        }
    }
 

Сумбурно описал, но могу пояснить, если что...
Класс распределения энергии http://pastebin.com/YEa36DUx
Буду безмерно благодарен , а то уже несколько раз переписывал, все равно запутываюсь.
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: Логика распределения энергии (совсем запутался)

Сообщение samana 23 янв 2017, 13:18

Уже много раз читаю эту тему и всё никак не могу просто представить саму задумку, даже не задумываясь о коде.
Например неизвестно о том, что спрашивал

Cr0c писал(а):Минимальный расход энергии у потребителей есть?
Динамическое изменение распределения энергии при добавлении потребителя есть?
При уменьшении процента потребления у остальных увеличивается или в свободную энергии идёт?


То-есть что должно происходить, когда есть два модуля и каждый потребляет 10 единиц энергии, и у каждого выставлено пользователем 100% потребления? Что это должно значить? То, что модуль всегда потребит свои 10 единиц из общего хранилища (если там хватит энергии конечно) ? А если выставить 5%, то сколько модуль сможет потребить?

Либо нельзя у двух модулей выставить 100% потребления? И если один модуль выставлен на 100%, то второй модуль автоматически будет потреблять 0% (то-есть ничего) ?

Так же не понятно, для чего у модулей ей своё значение потребления энергии (float), если вы хотите иметь возможность распределять энергию из общего хранилища в процентном соотношении.
Что я имею ввиду: допустим есть два модуля, одни потребляет 10 единиц, а другой 90 единиц. Получается если я выставлю 50% для первого модуля и 50% для второго, то сколько единиц они должны получить, если общее хранилище имеет 100 единиц энергии?

Может и я сумбурно объяснил, но лично у меня вопрос не о реализации, а просто о самой идее.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Логика распределения энергии (совсем запутался)

Сообщение EagleOwle 23 янв 2017, 14:27

Идея. Есть робот. У него модули (руки, ноги, голова, пушки и т.п.)
Все модули потребляют процент энергии, который вырабатывает реактор.

Задача 1.
Имметь возможность распределять процент потребления энергии между модулями (или в любом конкретном модуле так), что бы в сумме было не более 100%
Задача 2.
Рапределённая энергия не должна превышать заданных верхнего и нижнего порогов(не процентов, а именно конкретной величины).
Задача 3.
Иметь возможность в меню видеть как процент потребления энергии так и величину потребляемой энергии.
Задача 4.
Динамически менять процент потребляемой энергии так, что бы не превышались заданные пороги при изменении величины энергии, вырабатываемой реактором.

Оставим пока персонажа. Загвоздка в меню.
Есть UI обьекты с экземплярами классов UI_ModulEnergy
http://pastebin.com/wMdFAPy7
И есть экземпляр класса UI_EnergyConfig
http://pastebin.com/YEa36DUx
Главная проблема вписать в эту логику максимальный и минимальный пjрог значения EnergyPower
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27

Re: Логика распределения энергии (совсем запутался)

Сообщение getAlex 23 янв 2017, 17:15

samana писал(а):Уже много раз читаю эту тему и всё никак не могу просто представить саму задумку, даже не задумываясь о коде.

Прочитал мимо строк 2 предложения и достаточно понятно. Шкала настройки налогов симсити, учитывая что есть обычная ставка и процентная и нельзя падать ниже минимального оклада. К примеру армия/здравохранение/пенсия. Двигаешь ползунок пенсии в плюс, падают два других, но не ниже минимума. Или более упрощённый вариант - распределение энергии в суприм коммандере. Хотя это слишком абстрактный пример. Ничего сложного не вижу.
x+x%=n1
y+y%=n2
z+z%=n3
n1+n2+n3=100%
Увеличиваем Z, падает в % n1 и n2. Как только n1 (или n2) упирается в свой минимум, дальше падает только n2 (или n1). Как только n1 и n2 упирается в свой минимум, Z уже не можем двигать. Простейшая задача. Хотя у автора сейчас похоже синдром антипаттернов, судя по лексикону, и он в упор не видит решения, плодит какие-то абстрактные классы и злоупотребляет наследованием. И когда запутываешься в своей же архитектуре, задачки уровне алгоритмов вообще в голове не укладываются.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Логика распределения энергии (совсем запутался)

Сообщение samana 23 янв 2017, 17:25

getAlex писал(а):Прочитал мимо строк 2 предложения и достаточно понятно. Шкала настройки налогов симсити. Или более упрощённый вариант - распределение энергии в суприм коммандере


В эти игры не играл, видимо поэтому до меня и не доходит.
Теперь надеюсь автор темы решит свою задачу.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Логика распределения энергии (совсем запутался)

Сообщение getAlex 23 янв 2017, 17:38

samana писал(а):В эти игры не играл, видимо поэтому до меня и не доходит.

В любых глобальных или космических стратегиях есть такие ползунки. Тот же endless space -регулировка мощностей науки. Или распределение между производство/сельское хозяйство/наука. Тут разница лишь в резервировании минимума на каждую полоску.
getAlex
Адепт
 
Сообщения: 1775
Зарегистрирован: 10 авг 2013, 18:30

Re: Логика распределения энергии (Решено)

Сообщение EagleOwle 24 янв 2017, 08:32

Ну, форум для того и создан, что бы в том числе помогать новичкам...
В любом случае задачу я решил. Помог полный "проход" по коду в процессе написания здешних постов.
За одно узнал, что существует синдром анти патернов.
Так что всем откликнувшимся спасибо.
EagleOwle
UNIверсал
 
Сообщения: 493
Зарегистрирован: 02 янв 2015, 16:27


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5