XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Borodach

offline
Опыт: 5,837
Активность:
Как исправить сбой подсчета чисел?
Вот система подсчета
И если передавать значение больше 150, то возвращает далеко не верное значаение.
» code
function AniSpeed takes integer AtSpeed,real AnSpeed returns real
local integer l = 0
local real data = 0.350
local real temp = 0.350
    if AtSpeed > 0 then
            loop
                set temp = data - ( temp * (0.01 * l) )
                call BJDebugMsg(R2S(temp))
                set l = l + 1
                exitwhen l > AtSpeed
            endloop
    endif
    return temp
endfunction
Если это внутри игровая ошибка, то можно ее как то избежать?

Отредактировано DragonSpirit, 28.03.2013 в 17:02.
Старый 28.03.2013, 13:51
ScorpioT1000
Работаем
offline
Опыт: отключен
Есть мнение, что это какая-то ущербная система, что она делает?
Старый 28.03.2013, 20:25
Borodach

offline
Опыт: 5,837
Активность:
ScorpioT1000, Высчитывает скорость анимации в зависимости скорости атаки
Старый 28.03.2013, 22:55
Variecs

offline
Опыт: 2,508
Активность:
а AnSpeed зачем?
Старый 28.03.2013, 23:42
Borodach

offline
Опыт: 5,837
Активность:
Variecs, Скорость анимации у юнита. Чтоб не было лишний информации я поставил какое уже задано юниту, 0.350

Отредактировано Borodach, 29.03.2013 в 00:19.
Старый 28.03.2013, 23:56
agentex

offline
Опыт: 34,834
Активность:
Высчитывает скорость анимации в зависимости скорости атаки
лол? ну хз я это делал в одно действие когдато, зачем тут цикл вобще
Старый 29.03.2013, 01:04
ScorpioT1000
Работаем
offline
Опыт: отключен
это обычно синусом делается идк
ScorpioT1000 добавил:
кароче говоря, напиши мат. формулу, мне лень разгребать, что должно быть
Старый 29.03.2013, 01:55
Borodach

offline
Опыт: 5,837
Активность:
agentex:
ну хз я это делал в одно действие когдато, зачем тут цикл вобще
Так напиши каким
ScorpioT1000:
кароче говоря, напиши мат. формулу
Суть в том, что каждое следующие число, будет меньше на 1% предыдущего.
0.350 * 1% = 0.0035, 0.350 - 0.0035 = 0.3465
Я так понимаю что так превышается лимит чисел.

Отредактировано Borodach, 29.03.2013 в 08:07.
Старый 29.03.2013, 08:01
ScorpioT1000
Работаем
offline
Опыт: отключен
хорошо, спрошу иначе
покажи на нескольких примерах, что ты передаешь в функцию и что хочешь получить
Старый 29.03.2013, 13:31
Borodach

offline
Опыт: 5,837
Активность:
ScorpioT1000,
AtSpeed - текущая скорость атаки, AnSpeed - Анимация точки повреждения
У "Гороного короля" стандартная скорость точки повреждения равна 0.350, а при получении предметов повышающих скорость атаки, это число уменьшается.
В начале атаки, я передаю "Анимацию точки повреждения" атакующего и его текущую скорость атаки. Это вычисление должно возвращать через какое время Атакованый получит урон.
Но если скорость атаки превышает ~150, то вычисления уже не верные.
Старый 29.03.2013, 14:32
ScorpioT1000
Работаем
offline
Опыт: отключен
так тут математика, причем тут циклы я так и не понял)
Старый 29.03.2013, 15:10
Borodach

offline
Опыт: 5,837
Активность:
ScorpioT1000, Я в математике не силен, мне в голову не пришла математическая формула. Если не сложно, скажи каким образом мне высчитать.
Старый 29.03.2013, 16:02
ScorpioT1000
Работаем
offline
Опыт: отключен
тебе просто надо 3 входных параметра:
  • "нормальная" скорость атаки (normalAttackSpeed), т.е. та что задана в ро
  • скорость анимации при "нормальной" скорости атаки (normalAnimSpeed), т.е. нормальная Анимация точки повреждения
  • текущая скорость атаки (attackSpeed), т.е. та что действительно сейчас у юнита
и тогда уже можно делать вычисления, простая зависимость
function GetAnimationSpeedRatio takes real normalAttackSpeed, real normalAnimSpeed, real attackSpeed returns real
	return (attackSpeed / normalAttackSpeed) * normalAnimSpeed;
endfunction
и тогда будет так
GetAnimationSpeedRatio(100, 0.350, 150) // = 0.525
GetAnimationSpeedRatio(100, 0.350, 110) // = 0.385
она возвращает Анимация точки повреждения, которая действительно сейчас у юнита
Старый 29.03.2013, 16:21
Borodach

offline
Опыт: 5,837
Активность:
ScorpioT1000:
GetAnimationSpeedRatio(100, 0.350, 150) = 0.525
GetAnimationSpeedRatio(100, 0.350, 110) = 0.385
То есть юнит с скоростью атаки 150 будет медленнее юнита со скоростью 110? Или я снова туплю и не уловил твою мыслю?
Старый 29.03.2013, 19:07
ScorpioT1000
Работаем
offline
Опыт: отключен
ну например у него изначально скорость анимации 0.35, атаки 100, но в игре она стала 150, ты вызвал эту функцию (100, 0.35, 150), функция отдаст тебе 0.525, т.е. да, скорость быстрее получается
если надо медленней, то вот (делим наоборот):
function GetAnimationSpeedRatio takes real normalAttackSpeed, real normalAnimSpeed, real attackSpeed returns real
	return (normalAttackSpeed / attackSpeed) * normalAnimSpeed;
endfunction
Старый 29.03.2013, 19:12
Borodach

offline
Опыт: 5,837
Активность:
ScorpioT1000, Все равно возвращает не те числа которые нужны.
Для примера Горный король с Анимацией точки повреждения = 0.350
При атаке к примеру с перчатками скорости +15%, Анимация точки повреждения уже = 0.302
При атаке к примеру с перчатками скорости +30%, Анимация точки повреждения уже = 0.267
Вот мне нужно узнать формулу, уменьшения времени, Анимации точки повреждения, в зависимости скорости атаки.
Может карта, даст тебе больше информации, какая именно формула нужна.
Прикрепленные файлы
Тип файла: w3x DS.w3x (13.5 Кбайт, 0 просмотров )

Отредактировано Borodach, 29.03.2013 в 21:07.
Старый 29.03.2013, 20:55
Variecs

offline
Опыт: 2,508
Активность:
Borodach, это замечательно, но в функции НЕ ИСПОЛЬЗУЕТСЯ AnSpeed.
Старый 29.03.2013, 23:46
Borodach

offline
Опыт: 5,837
Активность:
Variecs, Я просто уже написал значение которое передается как AnSpeed, 0.350
Старый 29.03.2013, 23:55
Variecs

offline
Опыт: 2,508
Активность:
Borodach, это для теста или для наглядности сделано? Потому что выглядит как типичный индусский код.
Формула записывается гораздо проще: умножаешь AnSpeed на 0,99 в степени AtSpeed, благо для степени есть нативка. Глядишь, и ошибка пропадёт. Да и кода заметно меньше.
Старый 30.03.2013, 00:03
Borodach

offline
Опыт: 5,837
Активность:
Variecs, Пробовал умножать на 0.99. Сбоя не дает, но считает с небольшим уклонением (хотя логически одинаковые должны быть)
Старый 30.03.2013, 00:08
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 00:00.