@Kydesn1k

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

Я не очень силен в математике, так что не очень понимаю как реализовать решение

Мне нужно сделать так:
Чем меньше здоровья у игрока тем больше урона он будет наносить.
При этом должно быть задействовано maxMulty

Что бы это не было банальное проверкой через if
if hp < 24 then
 damage * 4
end


Допустим:
Урон - 100
Здоровье 24
Максимальный множитель 4

local maxMulty = 4
local damage = 100
local hp = 24
local maxHP = 100
local percHP = hp / maxHP --Получение процента от хп
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
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
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev
software engineer
max_health = 100
current_health = 24
max_damage_multiplier = 4

получаем текущий процент здоровья (current_health / max_health)
переворачиваем его, чтобы получить прибавку от мЕньшего здоровья (1 - current_health / max_health)

умножаем максимально возможный множитель на полученный процент, и получаем:
current_damage_multiplier = max_damage_multiplier * ( 1 - current_health / max_health )


потом просто умножаешь урон на множитель
damage = damage * current_damage_multiplier

Хранить процент здоровья отдельно не нужно, если есть макс и текущее, всегда же можно вычислить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы