Основным ресурсом в моей игре является масса , хранящаяся в виде числа с плавающей запятой, которое меняется со временем. Ресурсные узлы увеличивают массу, а заводы истощают ее. Например, если у меня есть ресурсный узел, выдающий 5 масс в секунду, я буду набирать 5 * deltaT
массу с каждым шагом игры. Масса отображается округленной до ближайшего целого числа, а показатели прибыли / убытка отображаются на десятые доли.
Как мне справиться с массой удара ноль? Это создает состояние гонки, если несколько фабрик пытаются построить одновременно: фабрик, которые находятся в очереди сначала или которые истощают меньше ресурсов, получают приоритет, как только появляется больше ресурсов, и поэтому они строятся быстрее, чем другие.
Как я могу справиться с этим? Должен ли я пропустить шаг полностью?
источник
Ответы:
Я согласен с Петром: нет никакого способа сделать это. То, как вы хотите это сделать, зависит от того, как вы хотите создать свою игру.
Однако в этих обстоятельствах, я думаю, сразу становится очевидным тот тип механики, к которому вы стремитесь: вы просто хотите, чтобы вещи производились как можно быстрее, в пределах имеющейся массы.
Производить в пределах возможностей
Я собираюсь взять лист из книги Верховного главнокомандующего, так как вы делаете систему, очень похожую на их: если вы производите больше мощности, лучший способ справиться с ней - это замедлить производство по всем направлениям. Снижение производственных мощностей на самом деле довольно просто.
Механик скорости производства
На каждом этапе обновления ваши фабрики не просто производят определенное количество: они работают с производительной скоростью , которая определяет, какой прогресс они делают на каждом шаге и какую массу они расходуют. Когда вы производите с производительностью 75%, ваши заводы на 75% увеличивают прогресс на каждом этапе и расходуют 75% массы по сравнению со 100% производительностью.
Чтобы рассчитать скорость производства, прежде чем строить что-либо вообще, вы должны запросить свои фабрики, чтобы определить общие ресурсы, которые будут использоваться на этом этапе на полную мощность. Затем вы выполняете простой расчет:
Допустим, вам нужно 125 масс на этом шаге, чтобы произвести на полную мощность, но только 100 масс на этом шаге. Это уравнение обеспечивает скорость производства 0,8 (десятичное представление 80%). Когда вы говорите своим фабрикам, чтобы они действительно выполняли их строительство , вы передаете им это значение, чтобы сообщить им, с какой скоростью они строят: и теперь ваше производство замедляется по всем направлениям.
альтернативы
Вы также можете начать временное закрытие заводов до тех пор, пока не освободятся производственные мощности, и было бы очень интересно увидеть, что это происходит с заводами, расположенными дальше от генераторов, когда они работают на очень низкой мощности.
Несколько ресурсов?
До вас, как вы справляетесь с этим; вариантов много. Самый простой из них - это, вероятно, рассчитать производственную мощность для каждого ресурса, а затем выбрать самый низкий , чтобы ваш самый слабый ресурс стал узким местом для всех остальных.
источник
Хотя мне нравится ответ Джонатана Хоббса, я думаю, что система очередей еще проще:
Это, вероятно, будет работать в среднем так же, как реализация Джонатана. Однако решение Джонатана может создать проблемы, если рабочая скорость установлена на очень низком уровне, и моя реализация может иметь фабрику с очень высоким запросом ресурсов для этого кадра, если она блокирует другие фабрики на несколько кадров.
источник
Я разрабатываю аналогичную систему снабжения в своей собственной игре, поэтому я также думал о том, как решить проблему блокировки снабжения и фаворитизма. Чтобы проиллюстрировать проблему, я создам простой пример:
Если у вас есть список: [продюсер1, потребитель1, потребитель2, потребитель3] и вы обновляете по порядку, начиная с supply = 0, вы получите следующее:
Потребитель1 получает все удовольствие, в то время как потребители 2 и 3 голодают, пока потребитель 1 не будет удовлетворен. В зависимости от вашей игры это может быть нежелательно. Я знаю, в моей игре это не так. Когда я подойду к этому, я собираюсь создать очередь, в которой потребители, которых кормят за один тик, переместятся в конец очереди для следующего тика, что, как я полагаю, является тем, к чему идет Рой Т. Пример выше будет выглядеть так:
Таким образом, каждый получит свою справедливую долю ресурсов.
Я также планирую реализовать дополнительную очередь, которая будет использоваться в качестве очереди с приоритетами, чтобы пользователь мог выбирать определенные структуры, чтобы иметь приоритет ресурсов. Очередь с приоритетом всегда будет обслуживаться до стандартной очереди. Убедитесь, что все производители обновляются в первую очередь, а затем потребляют все ресурсы, в противном случае очередь сломается, когда вы производите ресурсы на полпути через галочку, а некоторые потребители уже голодали.
Итак, подведем итоги: обновите производителей, затем очередь с приоритетами, переместив фид-потребителей в конец приоритетной очереди, затем обновите стандартную очередь, переместив фид-потребителей в конец стандартной очереди.
источник
Что ж, я более подробно остановлюсь на идее Джона, так как мы немного обсудили это в чате .
редактировать: это решение на самом деле является предпочтительным только в том случае, если в зависимости от того, как часто фабрика должна получать пакет ресурсов, имеет отношение расходный объем. Если все одинаково, то вы действительно можете просто использовать очередь.
Мое решение: все заводы перечислены в очереди с приоритетами. Приоритет увеличивается, поскольку фабрика страдает от голода. Голод, приоритет, устанавливается на ноль, когда фабрика использует ресурсы. Главным приоритетом всегда будет получение следующей партии ресурсов.
При определении того, какая фабрика получает какие ресурсы, в каком-то псевдокоде:
Таким образом, ваши фабрики будут производить по 1 продукту по очереди, если вы захотите откорректировать, приняв во внимание учет потребления, чтобы более дешевые продукты производились чаще, например, вы можете повысить приоритет на 1 / потребление.
источник
Странный вопрос.
То, что вам нужно сделать, зависит от логики игры, которую вы создаете. Вы можете сделать очередь, вы можете пропустить. Зависит от того, как, по вашему мнению, должна вести себя ваша игра. Поправьте меня, если я ошибаюсь по вашему вопросу.
источник
Вы можете сохранить количество общей потребности в ресурсах на один тик для всех конструкций. Если на одно хранилище ресурсов попадет меньше этого требуемого количества, то все строительство будет полностью остановлено, пока хранилище не соберет достаточно для поддержки как минимум 1 тика производства. Тогда производство может возобновиться.
Таким образом, вместо того, чтобы хранить объем производства в виде числа с плавающей запятой, он является двоичным - либо ваша фабрика производит на полной скорости, либо нет.
Тем не менее, этот подход, по сути, такой же, как ответ Джонатана, для особых случаев производительности 0,0 и 1,0 - произвольный float f с 0,0 <= f <= 1,0, вероятно, более элегантен, поскольку вы не получаете резких движений объема хранения , но логика должна быть немного проще.
источник