Я решил сделать способность, которая снижает урон полученный юнитом в "лицо", то есть если он смотрит на противника, урон заметно снижен, если стоит спиной то нет. Зная координаты владельца способности и агрессора, я нахожу проекцию 3 точки (дистанция между двумя юнитами и угол поворота владельца способности), образуется треугольник, с помощью формулы по координаторам x, y я находу cos угла и сравниваю его с 45. Но происходит черти что, условие то игнорируется, то не проходит в обще, не понятно почему дистанция между юнитами находиться криво. Вот код условия.
function Trig_Shield_Mass_Conditions takes nothing returns boolean local integer i = 0 //local unit u = GetTriggerUnit() local unit u = GetAttackedUnitBJ() loop exitwhen udg_Shield_unit[i] == u set i = i + 1 endloop local real xa = GetUnitX(udg_Shield_unit[i]) local real ya = GetUnitY(udg_Shield_unit[i]) local real xb = GetUnitX(GetAttacker()) local real yb = GetUnitY(GetAttacker()) local real d = SquareRoot(Pow(xa - xb, 2)+Pow(ya - yb, 2)) local real a = GetUnitFacing(udg_Shield_unit[i]) local real xc = xa + d * Cos(a * bj_DEGTORAD) local real yc = ya + d * Sin(a * bj_DEGTORAD) //if (AcosBJ((RAbsBJ(xa-xb)*RAbsBJ(xa-xc)+RAbsBJ(ya-yb)*RAbsBJ(ya-yc))/(SquareRoot(Pow((xa-xb),2)+Pow((ya-yb),2))*SquareRoot(Pow((xa-xc),2)+Pow((ya-yc),2)))) <= 45) then if (AcosBJ((Pow((xb-xa),2)+Pow((yb-ya),2)+Pow((xc-xa),2)+Pow((yc-ya),2)-Pow((xc-xb),2)-Pow((yc-yb),2))/2*SquareRoot(Pow((xb-xa),2)+Pow((yb-ya),2))*SquareRoot(Pow((xc-xa),2)+Pow((yc-ya),2))) < 45) then return true endif set u = null return false endfunction
если что там 2 разные формулы, проверял как будет работать, может быть у меня не правильные формулы или я не правильно понимаю что-то, по идеи когда враг сзади юнита угол должен быть тупым и должно возвращать false
Сообщение отредактировал Syzaky - Суббота, 22 Сентября 2012, 18:57:31
ок сейчас посмотрю, просто не давно занялся всем этим не все функции знаю но все равно не понятно почему мое не работает.
Добавлено (22 Сентября 2012, 19:22:29) --------------------------------------------- Наверное где-то в другом месте ошибка, все равно условие срабатывает без разницы куда кто смотрит.
kapa6acvlk, ты видимо меня не так понял, ты под спойлер в обще заглядывал? Или ты заглянул и увидел ошибку? Если ты нашел ее просто скажи, что она там есть и все, решение не нужно. (кроме совета использовать atan2, я знаю что эта функция делает, просто не знал что она в Jass есть и по идеи моя формула дублирует это дело, формулу я делал вдали от компа и интернета, вспомнил что мог из школы, перепроверил, она должна быть рабочей, хоть и лишний труд)