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

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

Закрытая тема
 
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Стоит ли юнит за спиной юнита?
Тут есть такая проблемка... Нижеприведённая функция должна возвращать булиан (тру или нетру), стоит ли юнит uWhichBack спиной к юниту uF, т.е. находится uF (стоящий за спиной) за спиной uWhichBack("спина"), или нет. У меня реализовано таким образом - равен ли угол между стоящему за спиной и "спиной" направлению угла "спины" (плюс-минус 90 градусов). Однако на практике данная функция возвращает в любом случае только false и ничего больше. Пожалуйста, найдите ошибк, объясните, чего не так и дайте по голове, когда не пойму =).
Насчёт утечек не беспокойтесь - даже не говорите мне про них =). Если надо, я сам потом уберу GetUnitLoc... =)
Код:
function CP_IsUnitBack takes unit uF, unit uWhichBack returns boolean
    local real r1=AngleBetweenPoints(GetUnitLoc(uF),GetUnitLoc(uWhichBack))
    local real r2=GetUnitFacing(uWhichBack)
    if r2>=(r1+90) and r2<=(r1-90) then
      return true
    else
      return false
    endif
    return false
endfunction


FREEZE_ball добавил:
Хех, Jon, я же просматривал свой код раз сто и не понял в чём тут фишка)). Это первый мой код, над которым я думал больше часа... (шучу) Кстати, если бы изменение знаков действительно было проблемой, то true возвращалось бы, когда "стоящий за спиной" был бы перед "спиной", а оно возвращает false всегда.
И ксати, согласно тригонометрии, 90 градусов=450 градусов=-270 градусов =)
Старый 18.04.2008, 20:25
J
expert
offline
Опыт: 48,447
Активность:
Код:
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
   local real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360
   local real r2 = GetUnitFacing(uWhichBack) + 360
   if GetUnitY(uWhichBack) < GetUnitY(uF) then
       set r1 = r1 + 360
   endif
   return r1<=(r2+60) and r1>=(r2-60)
endfunction

Отредактировано Jon, 10.07.2008 в 20:58.
Старый 18.04.2008, 20:30
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
AngleBetweenCordDeg - стесняюсь сказать, но имхо, у мну такой функции нет (), ибо выдаёт ошибку:
Код:
local real r1=AngleBetweenCordDeg(GetUnitX(uF), GetUnitY(uF), GetUnitX(uWhichBack), GetUnitY(uWhichBack))+360 - Отсутствует название


FREEZE_ball добавил:
По JASS API проверил - нету =\

FREEZE_ball добавил:
На всякий случай, поменяю на Location(GetUnitX(uF), GetUnitY(uF))
Старый 18.04.2008, 20:46
J
expert
offline
Опыт: 48,447
Активность:
ну уж можно было догодатся что это по нозванию и пораметрам... =//
Старый 18.04.2008, 20:50
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Можно было... Да вот сложно =) Я упал под стул, когда ВЕ мне еррор выдал =) По теме: значит, меняю на AngleBetweenPoints?
Старый 18.04.2008, 20:53
J
expert
offline
Опыт: 48,447
Активность:
...

короче
Код:
local real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360

Отредактировано Jon, 18.04.2008 в 21:02.
Старый 18.04.2008, 20:55
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Да ладно, отлично работает с
Код:
function CP_IsUnitBack takes unit uF, unit uWhichBack returns boolean
    local real r1=AngleBetweenPoints(Location(GetUnitX(uF), GetUnitY(uF)), Location(GetUnitX(uWhichBack), GetUnitY(uWhichBack)))+360
    local real r2=GetUnitFacing(uWhichBack)+360
    return r1<=(r2+60) and r1>=(r2-60)
endfunction

Большое спасибо. Тему можно клоз. =)
Старый 18.04.2008, 21:01
J
expert
offline
Опыт: 48,447
Активность:
Код:
local real r1=AngleBetweenPoints(Location(GetUnitX(uF), GetUnitY(uF)), Location(GetUnitX(uWhichBack), GetUnitY(uWhichBack)))+360
Как грусно...

Jon добавил:
поставь строчку как я сказал в 6 посте
Старый 18.04.2008, 21:03
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Ладно, спасибо. Поставлю.

Итак, конечный вариант:
Код:
function CP_IsUnitBack takes unit uF, unit uWhichBack returns boolean
    local real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360
    local real r2=GetUnitFacing(uWhichBack)+360
    return r1<=(r2+60) and r1>=(r2-60)
endfunction
Старый 18.04.2008, 21:14
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Chiters попросил пример на ГУИ. Выкидываю. После скачки тему можно закрывать...
Прикрепленные файлы
Тип файла: w3x GUI.w3x (12.9 Кбайт, 119 просмотров )
Старый 12.05.2009, 18:44
Закрытая тема

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

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

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

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



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