Задать вопрос
  • Как сделать постепенное увеличение урона за отсутствие N-ово кол-ва здоровья?

    dollar
    @dollar Куратор тега Lua
    Делай добро и бросай его в воду.
    Введём доп. величины для удобства изложения:
    local startDamage = damage -- Начальное значение на отрезке
    local endDamage = damage * maxMulty --Конечное значение

    Итак у нас есть startDamage, endDamage и percHP. Нам нужно скалировать значение урона от начального до конечного, в зависимости от процента. Показываю на пальцах, как дойти до формулы самому.
    • Очевидно, что когда percHP==1, мы берём startDamage.
    • Очевидно, что когда percHP==0, мы берём endDamage.
    • Что же брать, если percHP==0.5? Очевидно, среднее арифметическое. То есть (startDamage + endDamage)/2, или что то же самое startDamage/2 + endDamage/2

    И здесь уже виден намёк на то, какой будет формула. На 50% мы берём половину от начального и половину от конечного значения. На 60%, очевидно, надо брать 40% от начального и 60% от конечного.
    Значит, формула такая:
    startDamage * percHP + endDamage * (1 - percHP)
    Можно, конечно, подставить теперь сюда ваши переменные, но не советую этого делать, так как в текущем виде формула максимально проста и понятна.

    В мире программирования функцию линейной интерполяции принято называть lerp, хотя это дело вкуса. Тут важно, что она не связана с хп, а пишется в общем виде (немного адаптировал к данному вопросу):
    local function lerp(start_val, end_val, perc)
      return start_val * perc + end_val * (1 - perc) 
    end

    Если объявили эту функцию, то ниже можно будет писать:
    lerp(damage, damage * maxMulty, percHP)

    Если объявить функцию глобально, то можно будет использовать её в прерываниях в любом месте проекта. Глобально объявляется без слова local:
    function lerp(start_val, end_val, perc)
      return start_val * perc + end_val * (1 - perc) 
    end

    Проверка:
    print(lerp(100,400,0.9)) -- 130
    Ответ написан
    3 комментария