Добавлен antonpoganui
Мне нужен прыжок по дуге что бы работало на любое расстояние к примеру по формуле " свободное падение тел " (у меня прыжок получается по дуге только на определенные расстояние)
P.S. Желательно на GUI, зарание спасибо :)
P.S. Желательно на GUI, зарание спасибо :)
Принятый ответ
По идиотски, но работает (математика 7 класс)
Caster = юнит, применивший скил
PointCaster = позиция кастера
PointTarget = точка скила
PointMiddle = Расстояние между PointCaster и PointTarget делить на 2 (середина прыжка, где будет его максимальная высота, потом снижение)
RealDistance = 0 (расстояние, на которое юнит будет двигаться каждую 0.01)
RealHeight = 0 (высота)
Включить Timer, который зазвонит через 0.01 секунд
PointCaster = позиция кастера
PointTarget = точка скила
PointMiddle = Расстояние между PointCaster и PointTarget делить на 2 (середина прыжка, где будет его максимальная высота, потом снижение)
RealDistance = 0 (расстояние, на которое юнит будет двигаться каждую 0.01)
RealHeight = 0 (высота)
Включить Timer, который зазвонит через 0.01 секунд
В таймере:
PointCasterNow = позиция Caster
PointMove = PointCasterNow смещение на RealDistance
Двигать Caster в PointMove
RealHeight = корень из RealDistance (сама формула)
Установить высоту Caster как RealHeight
*Если расстояние между PointMove и PointMiddle = 0
-То,
RealDistance = RealDistance - 1
-Иначе,
RealDistance = RealDistance + 1 (или сколько хочешь)
*Если расстояние между PointMove и PointTarget = 0
-То,
Пауза Timer
-Иначе,
-
PointCasterNow = позиция Caster
PointMove = PointCasterNow смещение на RealDistance
Двигать Caster в PointMove
RealHeight = корень из RealDistance (сама формула)
Установить высоту Caster как RealHeight
*Если расстояние между PointMove и PointMiddle = 0
-То,
RealDistance = RealDistance - 1
-Иначе,
RealDistance = RealDistance + 1 (или сколько хочешь)
*Если расстояние между PointMove и PointTarget = 0
-То,
Пауза Timer
-Иначе,
-
Утечки сам удалишь.
Ну или иначе вот сама формула на джассе
function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
return (4 * h / d) * (d - x) * (x / d)
endfunction
h - максимальная высота в прыжке на середине расстояния (x = d / 2),
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
У меня в принципе тоже самое.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Hate
Отредактирован Maniac_91
Отредактирован Raised
Тебе нужно придумать какую то там формулу, при которой, через ряд делений/умножений, зависимых от расстояния, будет определено значение, которое будет отниматься от значения прибавляемой юниту высоты (изначально 50, и до середины прыжка оно должно достигать 0, чтобы дальше высота плавно прибавлялась в минус).
Если расстояние меньше N% от максимального, то прибавлять столько высоты, иначе другой иф. И так около четырех ифов, при которых будет угловатая, но дуга.
Отредактирован Lotus101
PointCaster = позиция кастера
PointTarget = точка скила
PointMiddle = Расстояние между PointCaster и PointTarget делить на 2 (середина прыжка, где будет его максимальная высота, потом снижение)
RealDistance = 0 (расстояние, на которое юнит будет двигаться каждую 0.01)
RealHeight = 0 (высота)
Включить Timer, который зазвонит через 0.01 секунд
PointCasterNow = позиция Caster
PointMove = PointCasterNow смещение на RealDistance
Двигать Caster в PointMove
RealHeight = корень из RealDistance (сама формула)
Установить высоту Caster как RealHeight
*Если расстояние между PointMove и PointMiddle = 0
-То,
RealDistance = RealDistance - 1
-Иначе,
RealDistance = RealDistance + 1 (или сколько хочешь)
*Если расстояние между PointMove и PointTarget = 0
-То,
Пауза Timer
-Иначе,
-
return (4 * h / d) * (d - x) * (x / d)
endfunction
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.
Отредактирован ledoed
real d=дистанция от юнита до точки
real s=30-скорость
real l=h/( (d*.5) /s)
real v=0-переменая для расчётов
теперь по таймеру v=v+l пока v>=h.а потом инвертируй l=l*(-1) пока v<=0
переменнe. v подставь так SetUnitFleight(unit,v,0) на гуи там похожее название
.