Это очень тупой вопрос... и поскольку я тоже тупой надеюсь можно)
Всё что я узнаю по матеше, это по сути все ваши ответы и метод тыка
Я знаю только как через время сделать плавное замедление (тек. сила-(нач. сила/макс. время движения*период таймера)), и там можно в принципе методом тыка настроить так, как я хочу, но это жуть как неудобно и при каких-либо малейших изменениях будет сложно перенастраивать...
Наверное, лучше примером:
Юнит отталкивается на 250 единиц, с силой... ну пускай 15, в течении 0.50 сек с периодичностью 0.03 сек.
Как сделать резкое отталкивание вначале и плавное в конце вплоть до 0?
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
26
3 года назад
1
Сделай базовую скорость толчка, например set Speed = 9.00
Запиши дистанцию толчка, например set Distance = 250.00
Дальше заводи таймер на 0.03 сек и каждый раз уменьшить Speed за счёт умножения его на значение от 0.94 до 0.96
Например так set Speed = Speed * 0.96
После чего уменьшай дистанцию на это число
set Distance = Distance - Speed
Тут же можешь двигать самого юнита от его текущей позиции, под нужным углом, на расстояние записанное как Speed.
Ну а в конце спрашивай есть ли смысл считать ещё раз
if Distance < Speed * 0.5 then
Обычно если можно пройти хотя бы половину, то я оставляю ещё тик.
Хотя при этом его можно обрезать, что б в итоге не превысить общую дистанцию
В самом начале:
set Speed = Speed * 0.96
if Distance < Speed then
set Speed = Distance
else
set Distance = Distance - Speed
endif
1
22
3 года назад
Отредактирован PROSHELDOTU
1
Extremator, и каким образом ты хочешь получить дистанцию меньше текущей скорости по такой формуле? Она там в принципе никогда не будет меньше. Так она не будет меньше даже если сравнивать с Базовой скоростью, которая всегда будет равна начальному значению, т.е. 9 в данном случае
А вот если заменить
Speed = Speed * 0.96
на
Speed = Speed - 0.05, например
то всё будет в данном примере
0
27
3 года назад
Отредактирован rsfghd
0
Видимо я что-то неправильно сделал, ибо скорость падает до 0, а дистанция нет (33.999 висит), в итоге даже таймер не выключается. Откуда берутся цифры 94-96?
Реализация
сделал по примеру
""
private void E_Move(){
timer t = GetExpiredTimer(); int i = GetHandleId(t)
unit u = LoadUnitHandle(H,i,0)
real a = LoadReal(H,i,1)/угол/, speed = LoadReal(H,i,2)/скорость/, dist = LoadReal(H,i,3)// дистанция

speed = speed*.96
dist = dist-speed
BJDebugMsg(R2S(speed))
BJDebugMsg(R2S(dist))
if dist <= speed*.5{
speed = dist
PauseTimer(t); DestroyTimer(t); FlushChildHashtable(H,i)
}else{
SaveReal(H,i,2,speed)
SaveReal(H,i,3,dist)
}
SetUnitX(u,GetUnitX(u)+speed*Cos(a));SetUnitY(u,GetUnitY(u)+speed*Sin(a))
t = null; u = null
}
private void E(){
timer t = CreateTimer();int i = GetHandleId(t)
SaveUnitHandle(H,i,0,GetSpellTargetUnit())
SaveReal(H,i,1,0.)
SaveReal(H,i,2,9.)
SaveReal(H,i,3,250)
TimerStart(t,.03,true,function E_Move)
""

+ проверил, таймер походу по приколу висит)
1
26
3 года назад
1
Proshel_Doty:
и каким образом ты хочешь получить дистанцию меньше текущей скорости по такой формуле? Она там в принципе никогда не будет меньше.
Ну а ты посчитай ))
rsfghd:
Видимо я что-то неправильно сделал, ибо скорость падает до 0, а дистанция нет (33.999 висит), в итоге даже таймер не выключается.
Поэтому базовую скорость и множитель замедления надо подкручивать.
Это ж не формула от и до, это топорный вариант.
1
22
3 года назад
Отредактирован PROSHELDOTU
1
Ну а ты посчитай ))
ну я и посчитал, точнее excel за меня разложил всё
Мб ты тоже попробуешь посчитать прежде ? )
Поэтому базовую скорость и множитель замедления надо подкручивать
и как ты собрался подкручивать множитель?
Подкручивая базовую скорость с такой формулой ты никогда не добьёшься желаемого
0
27
3 года назад
0
Extremator, ахах, так оно тогда по сути не отличается от моего варианта через время, что в самом вопросе, там тоже нужно подкручивать
0
27
3 года назад
0
Ну ладно, пофигу, я тогда сделаю уже через время с настройкой силы отталкивания, дебагом буду выводить какое расстояние пройдено и таким образом найду нужную скорость, благодарю комментаторов, что постарались помочь)
1
22
3 года назад
Отредактирован PROSHELDOTU
1
rsfghd, да это всё в Excel можно рассчитать за 1-2 минуты )
1
26
3 года назад
1
Proshel_Doty:
ну я и посчитал, точнее excel за меня разложил всё
Мб ты тоже попробуешь посчитать прежде ? )
Поэтому базовую скорость и множитель замедления надо подкручивать
и как ты собрался подкручивать множитель?
Подкручивая базовую скорость с такой формулой ты никогда не добьёшься желаемого
Ну вот я поставил s9. - этого мало, число уходит в 0 гораздо раньше нужного.
Подкрутил до s12. - лучше, но всё ещё мало.
Подкрутил до s18. - ещё лучше, но движение менее плавное стало.
Подкрутил множитель до .94 - стало нормально.
При скорости 2.064 дистанция падает на 0.339 а потом до 0 = таймер паузится.
Вот я и не добился желаемого подкручивая множители... вообще ни разу.
1
22
3 года назад
1
Extremator, действительно, если не менять дистанцию в 250 ед, а менять скорость или множитель, то дистанция при данных расчётах может стать меньше текущей скорости
Например, если просто множитель с 0.96 изменить на 0.97 или скорость изменить с 9 на 10
1
26
3 года назад
1
Proshel_Doty:
если не менять дистанцию
Поэтому, если дистанция динамическая, то можно выводить скорость из неё.
2
17
3 года назад
2
Загруженные файлы
Принятый ответ
0
27
3 года назад
0
Vlod, дааа))
Это то что и нужно было, спасибо большое)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.