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

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

Закрытая тема
 
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Неправильное возвращение юнита
Опять проблемы, опять со спеллами...
Вообщем есть спелл, который вертит цель вокруг кастера определенный промежуток времени. Фигня этого спелла заключается в том, что с его помощью, отдав в нужный момент какой-либо ордер, можно выбросить цель на воду. Я сделал так, чтобы цель возвращалась на землю:
» code
Код:
//...
    if IsTerrainPathable(GetUnitX(a), GetUnitY(a), ConvertPathingType(1)) then
        set dt = DistanceBetweenCoords(GetUnitX(a),GetUnitY(a),GetUnitX(u),GetUnitY(u))
        set f = R2I(GetUnitFacing(u))
        loop
            if not(IsTerrainPathable(GetUnitX(a) + dt * Cos(f*0.0174), GetUnitY(a) + dt * Sin(f*0.0174), ConvertPathingType(1))) then
                call SetUnitX(a, GetUnitX(a) + dt * Cos(f*0.0174))
                call SetUnitY(a, GetUnitY(a) + dt * Sin(f*0.0174))
            endif
            exitwhen not(IsTerrainPathable(GetUnitX(a) + dt * Cos(f*0.0174), GetUnitY(a) + dt * Sin(f*0.0174), ConvertPathingType(1)))
            set f = f + 1
        endloop
    endif
//...

a - цель
u - кастер

По идее цель должна попасть в точку, отмеченную красным кружком на картинке:


Но она туда не попадает! А попадает вообще хз куда, причем на расстояние, где-то вдвое большее, чем максимально возможное при юзе спелла, т.е. больше, чем dt. И, естественно, не под правильным углом. Почему? Как решить проблему?

Отредактировано Enein, 22.05.2009 в 10:15.
Старый 21.05.2009, 19:22
J
expert
offline
Опыт: 48,447
Активность:
это не ответ а просто замечание
Код:
//...
    if IsTerrainPathable(GetUnitX(a), GetUnitY(a), ConvertPathingType(1)) then
        set dt = DistanceBetweenCoords(GetUnitX(a),GetUnitY(a),GetUnitX(u),GetUnitY(u))
        set f = R2I(GetUnitFacing(u))
        loop
            if not(IsTerrainPathable(GetUnitX(a) + dt * Cos(f*0.0174), GetUnitY(a) + dt * Sin(f*0.0174), ConvertPathingType(1))) then
                call SetUnitX(a, GetUnitX(a) + dt * Cos(f*0.0174))
                call SetUnitX(a, GetUnitY(a) + dt * Sin(f*0.0174))
                exitwhen true
            endif
            set f = f + 1
        endloop
    endif
//...
Старый 21.05.2009, 19:41
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
теоретички если известен центр этой окружности, изнаю куда движется юнит, то нужно запомнить центр и радиус, и угол, а затем увеличивать(или уменьшать в зависимости куда напрвлена скорость) этот угол до тех пор пока не будет суша
Старый 22.05.2009, 09:53
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
J, ок
ELDAR, это будет тоже самое...

Ну а вообще спасибо, что натолкнул на мысль посмотреть от какой точки движется юнит:
Код:
call SetUnitX(a, GetUnitX(a) + dt * Cos(f*0.0174))
call SetUnitY(a, GetUnitY(a) + dt * Sin(f*0.0174))

Капец, надо же было от кастера, т.е:
Код:
call SetUnitX(a, GetUnitX(u) + dt * Cos(f*0.0174))
call SetUnitY(a, GetUnitY(u) + dt * Sin(f*0.0174))

Вот так! Всем спасибо за внимание, вопрос решен.

Отредактировано Enein, 22.05.2009 в 10:15.
Старый 22.05.2009, 10:02
Закрытая тема

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

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

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

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



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