Скилл прыжок
Мне нужен прыжок по дуге что бы работало на любое расстояние к примеру по формуле " свободное падение тел " (у меня прыжок получается по дуге только на определенные расстояние)
P.S. Желательно на GUI, зарание спасибо :)

Лучший ответ:
По идиотски, но работает (математика 7 класс)
Caster = юнит, применивший скил
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
-Иначе,
-
Утечки сам удалишь.
Ну или иначе вот сама формула на джассе

function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
h - максимальная высота в прыжке на середине расстояния (x = d / 2),
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.

У меня в принципе тоже самое.



Просмотров: 461

» Лучшие комментарии


Hate #1 - 6 месяцев назад (отредактировано ) 2
это не стол заказов
либо помогаем доработать, либо ждите добрую фею
Maniac_91 #2 - 6 месяцев назад (отредактировано ) 0
Возможно, эта статья и ещё одна статья помогут.
quq_CCCP #3 - 6 месяцев назад 0
Формула параболы лежит в библиотеке функций, двигать юнита таймером знаем как? Нет - марш читать статьи.
GF RaiseD #4 - 6 месяцев назад (отредактировано ) 0
Тут хорошо расписан человеческий способ. Хочешь GUI - используй арифметику. Правда, это сама боль...
Darknessay #5 - 6 месяцев назад -10
Больно осознавать, что это школьная геометрия, а у тебя с ней проблемы. Но такова жизнь.
Тебе нужно придумать какую то там формулу, при которой, через ряд делений/умножений, зависимых от расстояния, будет определено значение, которое будет отниматься от значения прибавляемой юниту высоты (изначально 50, и до середины прыжка оно должно достигать 0, чтобы дальше высота плавно прибавлялась в минус).
Но ты можешь не париться и сделать как у Сларка в доте:
Если расстояние меньше N% от максимального, то прибавлять столько высоты, иначе другой иф. И так около четырех ифов, при которых будет угловатая, но дуга.
Doc #6 - 6 месяцев назад 0
От 0 до 1 по Х, от 0 до 0.25 по У. Та же самая что и в формуле параболы в библиотеке.
Lotus101 #7 - 6 месяцев назад (отредактировано ) 0

По идиотски, но работает (математика 7 класс)
Caster = юнит, применивший скил
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
-Иначе,
-
Утечки сам удалишь.
Ну или иначе вот сама формула на джассе

function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
h - максимальная высота в прыжке на середине расстояния (x = d / 2),
d - общее расстояние до цели,
x - расстояние от исходной цели до точки, где следует взять высоту по параболе.

У меня в принципе тоже самое.
ledoed #8 - 6 месяцев назад (отредактировано ) 0
real h=500-высота
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) на гуи там похожее название
.