я делаю карту где будут массовые побоищя, пехота будет держа щит блокировать атаки, копейщики наносить доп урон коннице и т.д., как сделать что когда одна боевая единица бьет другую в спину наносился дополнительный урон, и если ещё знаете как сделать так что бы если пехотинец держит щит шанс на блок атаки был только если его бьют спереди, заранее спасибо.

Принятый ответ

на определение сзади ли юнит есть функция
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
        real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
        real r2 = GetUnitFacing(uWhichBack) + 360.
           if GetUnitY(uWhichBack) < GetUnitY(uF) then
               set r1 = r1 + 360.
           endif
        return (r1<=(r2+45.) and r1>=(r2-45.))
    endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
7
7 лет назад
0
Hate:
на определение сзади ли юнит есть функция
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
        real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
        real r2 = GetUnitFacing(uWhichBack) + 360.
           if GetUnitY(uWhichBack) < GetUnitY(uF) then
               set r1 = r1 + 360.
           endif
        return (r1<=(r2+45.) and r1>=(r2-45.))
    endfunction
ну выглядит конечно хорошо, но что то он у меня не пошел, ты мог скинуть карту с данным тригером, а то я в триггер вставил и он не работает(возможно ктрл с ктр в тут не канает?)
0
26
7 лет назад
0
но что то он у меня не пошел
всмысле не пошел?
а то я в триггер вставил и он не работает
всмысле вставил.
а ты как ожидал вообще?
0
22
4 года назад
0
Naadir:
Hate:
Полезная штука.
а вот и нет, угол вычисляется не верно при определённом ракурсе. И чем больше угол работы абилки, в данном случае 45 + 45 т.е. 90, тем больше будет заметен косяк
0
26
4 года назад
0
Proshel_Doty:
Naadir:
Hate:
Полезная штука.
а вот и нет, угол вычисляется не верно при определённом ракурсе. И чем больше угол работы абилки, в данном случае 45 + 45 т.е. 90, тем больше будет заметен косяк
сколько ни тестил, все вычислялось нормально
0
17
4 года назад
Отредактирован GetLocalPlayer
0
Скалярным произведением вектора a на вектор b, где
a = (Cos(GetUnitFacing(unit) * bj_DEGTORAD), Sin(GetUnitFacing(unit) * bj_DEGTORAD) // GetUnitFacing ведь в градусах возвращает?
b = B - A // A - позиция юнита; B - позиция цели
Если результат больше 0 - цель перед юнитом. Если меньше 0 - цель позади юнита. Если нужен определенный конус, то вектор b нужно нормализовать (делением его членов на длину), угол конуса нужно пересчитать в радианы, поделить пополам и сравнивать полученное значение со скалярным произведением.

и сравнивать полученное значение со скалярным произведением.
косинус полученного значения**
2
32
4 года назад
2
Конус без векторов для извращенцев (Доку не смотреть)
раскрыть
-- функия принадлежности точки сектора
-- x1, x2 - координаты проверяемой точки
-- x2, y2 - координаты вершины сектора
-- orientation - ориентация сектора в мировых координатах
-- width - уголовой размер сектора в градусах
-- radius - окружности которой принадлежит сектор
function IsPointInSector(x1,y1,x2,y2,orientation,width,radius)
	local lenght=DistanceBetweenXY(x1,y1,x2,y2)
	local angle=Acos(Cos(orientation*bj_DEGTORAD)*(x1-x2)/lenght+Sin(orientation*bj_DEGTORAD)*(y1-y2)/lenght )*bj_RADTODEG
	return angle<=width and lenght<=radius
end
0
22
4 года назад
Отредактирован PROSHELDOTU
0
Hate:
сколько ни тестил, все вычислялось нормально
Поставь того, кто получает урон в спину градусов на 20, и того, кто наносит так, чтобы угол от него к первому был градусов 340 (-20)

GetLocalPlayer:
хорошо объяснил, новички точно поймут )0

Bergi_Bear:
похоже на правду) это 100% протещено?)
0
32
4 года назад
0
похоже на правду) это 100% протещено?)
Конечно, удар адмирала так сделан
2
22
4 года назад
2
Bergi_Bear:
Конечно, удар адмирала так сделан
А ну всё, тогда вопросы отпадают, так бы сразу и сказал йо хо хо :D
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.