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

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

Ответ
 
vladfaust

offline
Опыт: 12,714
Активность:
Юнит в секторе?
Необходимо занести в группу всех красненьких юнитов...
Радиус - величина фиксированная, градусная мера сектора - тоже.
Head_Hunter_44 добавил:
Да, через jass, ессно, можно.
Head_Hunter_44 добавил:
Пожалуйста...
Миниатюры
Кликните на картинку для увеличения
Название:  11.JPG
Просмотров: 76
Размер:  9.6 Кбайт  
Старый 19.06.2011, 11:32
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Если угол направления стрелочки известен, то проверяй разницу между углом стрелочки и углом от центра круга до координат заносимых в группу юнитов - разница должна быть больше минус 30 и меньше 30 градусов
Старый 19.06.2011, 11:39
DemoN2099
annihilator
offline
Опыт: 4,418
Активность:
Проверяешь угол от центра до юнита.
Старый 19.06.2011, 11:54
vladfaust

offline
Опыт: 12,714
Активность:
Как же я не хочу вспоминать геометрию... Мож, кто ф-цию сделает?,..
Старый 19.06.2011, 12:02
Fatal
Sleeping awake
offline
Опыт: 1,244
Активность:
Pick every unit in range x + Move location x y ??? x= x+50(или сколько там нужно)
Старый 19.06.2011, 12:06
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
function Filtr takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and  GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG>=-30 and GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG<=30
endfunction
аццки получилось...сильно не пинайте за такое-_-
написал функцию-фильтр для группы,с учётом того что GetTriggerUnit() повернут в нужную сторону
отредактировал немного чтобы работало
Старый 19.06.2011, 12:16
vladfaust

offline
Опыт: 12,714
Активность:
Выглядит впечатляюще) Ща попробую...
Head_Hunter_44 добавил:
неа.
Head_Hunter_44 добавил:
function Trig_Spell_2_Filtering takes nothing returns boolean
return (IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and  GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG>=-30 and GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG<=30)
endfunction

function Trig_Spell_2_GrAc takes nothing returns nothing
call UnitDamageTargetBJ(GetTriggerUnit(), GetEnumUnit(), 9999.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE)
endfunction

function Trig_Spell_2_Actions takes nothing returns nothing
call BJDebugMsg("TriggerWorking")
local group g = CreateGroup()
local location loc = Location(GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()))
call GroupEnumUnitsInRangeOfLoc(g, loc, 300, Condition(function Trig_Spell_2_Filtering))
set udg_H1S2_G = g
call BJDebugMsg(I2S(CountUnitsInGroup(g))+" = count units")
call ForGroup(g, function Trig_Spell_2_GrAc)
set g = null
set loc = null
call GroupClear(udg_H1S2_G)
endfunction
Head_Hunter_44 добавил:
0 эффекта.
Head_Hunter_44 добавил:
Да, проблема в условии, т.к
0 = count units
Head_Hunter_44 добавил:
Памагите плз адынадын!!!
Перешел в 10 кдасс, я хз что такое радианы и что есть AtAn2 -_-
Старый 19.06.2011, 13:27
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
//function Trig_Spell_2_Filtering takes nothing returns boolean
//return (IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and  GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG>=-30 and GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetTriggerUnit())-GetUnitY(GetFilterUnit()),GetUnitX(​GetTriggerUnit())-GetUnitX(GetFilterUnit()))*bj_RADTODEG<=30)
//endfunction

function Trig_Spell_2_Filtering takes nothing returns boolean
return (IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405
endfunction

function Trig_Spell_2_GrAc takes nothing returns nothing
call UnitDamageTargetBJ(GetTriggerUnit(), GetEnumUnit(), 9999.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_FIRE)
endfunction

function Trig_Spell_2_Actions takes nothing returns nothing
call BJDebugMsg("TriggerWorking")
local group g = CreateGroup()
local real x=GetUnitX(GetTriggerUnit())
local real y=GetUnitY(GetTriggerUnit())
call GroupEnumUnitsInRange(g, x, y,300, Condition(function Trig_Spell_2_Filtering))
call BJDebugMsg(I2S(CountUnitsInGroup(g))+" = count units")
call ForGroup(g, function Trig_Spell_2_GrAc)
call GroupClear(g)
call DestroyGroup(g)
set g = null
endfunction
попробуй так - посмотрим будет ли оно вообще отлавливать юнитов - а потом уже подумаем над условием подходящим

Отредактировано Nerevar, 19.06.2011 в 13:39.
Старый 19.06.2011, 13:30
Kodoo
Ł☼√ę
offline
Опыт: 12,845
Активность:
Head_Hunter_44:
Перешел в 10 кдасс, я хз что такое радианы и что есть AtAn2 -_-
хы, дык это ты зачит зря перешел)
пи радиан - это 180 градусов
Аtan2 - арктангенс двух
Старый 19.06.2011, 13:32
vladfaust

offline
Опыт: 12,714
Активность:
арктангенс двух
Не было у нас такого, только тангенс и КОтангенс
Nerevar, да. Так все прерасно работает.
Head_Hunter_44 добавил:
Умные люди, плз подскажите условие...
Старый 19.06.2011, 13:54
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
function Trig_Spell_2_Filtering takes nothing returns boolean
return (IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0.405 and  GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetFilterUnit())-GetUnitY(GetTriggerUnit()),GetUnitX(​GetFilterUnit())-GetUnitX(GetTriggerUnit()))*bj_RADTODEG)>=-30 and GetUnitFacing(GetTriggerUnit())-Atan2(GetUnitY(GetFilterUnit())-GetUnitY(GetTriggerUnit()),GetUnitX(​GetFilterUnit())-GetUnitX(GetTriggerUnit()))*bj_RADTODEG)<=30
endfunction
поменял местами юнитов в условии - проверь
Старый 19.06.2011, 14:21
spellwerk

offline
Опыт: 4,869
Активность:
Atan2(dy,dx)=Atan(dy/dx)
    unit v = GetFilterUnit()  // фильтруемый юнит
    real dx = GetUnitX(v)-cx // cx - абсцисса кастера
    real dy = GetUnitY(v)-cy // cy - ордината кастера
    real ang = Atan2(dy,dx) * bj_RADTODEG
    real diff = RAbsBJ(ang-fc) // разница между углом между юнитом и кастером и поворотом юнита (fc)
    if ( diff <= 30. ) { // область воздействия - 60 градусов
        DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\StormBolt\\StormBoltMissile.mdl​",v,"head"))
    }
делал на скорую руку, но вроде работает
Старый 19.06.2011, 14:24
vladfaust

offline
Опыт: 12,714
Активность:
function Trig_Spell_2_Filtering takes nothing returns boolean
local real dx = GetUnitX(GetFilterUnit())- GetUnitX(GetTriggerUnit())
local real dy = GetUnitY(GetFilterUnit())- GetUnitY(GetTriggerUnit())
local real fc = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit())) - GetUnitFacing(GetTriggerUnit())
local real diff = RAbsBJ(Atan2(dy,dx)*bj_RADTODEG - fc)
    if ( diff <= 30.00 ) and IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit()) > 0 then
       return true
    endif
return false
endfunction
Неа...
Старый 19.06.2011, 14:55
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
local real fc = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit())) - GetUnitFacing(GetTriggerUnit())
  • точки создаются неудаляемые,да и угол между точками измеряется вроде как от -180 до 180
лучше уж замени на :
local real fc = GetUnitFacing(GetTriggerUnit())
Старый 19.06.2011, 15:06
vladfaust

offline
Опыт: 12,714
Активность:
Иногда работает, иногда нет.
Старый 19.06.2011, 15:23
vladfaust

offline
Опыт: 12,714
Активность:
local boolean b1 = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit()))>=(GetUnitFacing(GetTriggerUnit()) - 30.00)
local boolean b2 = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit()))<=(GetUnitFacing(GetTriggerUnit()) + 30.00)
local boolean b3 = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit()))<=(GetUnitFacing(GetTriggerUnit()) - 30.00)
local boolean b4 = AngleBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(GetFilterUnit()))>=(GetUnitFacing(GetTriggerUnit()) + 30.00)
local boolean b5 = IsPlayerEnemy(GetOwningPlayer(GetTriggerUnit()), GetOwningPlayer(GetEnumUnit()))
if ((b1 and b2) or (b3 and b4)) and b5
   return true
else
   return false
endif
Задевает только тех, кто вверху кастера.
Head_Hunter_44 добавил:
А терь вообще не работает
Head_Hunter_44 добавил:
Ужас.

Отредактировано Head_Hunter_44, 19.06.2011 в 22:21.
Старый 19.06.2011, 22:26
Elf_Stratigo

offline
Опыт: 4,699
Активность:
» вот, попробуй это
function GroupEnumUnitsInSector takes group whichGroup, real x, real y, real radius, real a1, real a2, boolexpr filter returns nothing
    local group g = CreateGroup()
    local unit u
    local real a
    call GroupEnumUnitsInRange(g,x,y,radius,filter)
    call GroupClear(whichGroup)
    loop
        set u=FirstOfGroup(g)
        exitwhen u==null
        call GroupRemoveUnit(g,u)
        set a=ModuloReal(bj_RADTODEG*Atan2(GetUnitY(u)-y,GetUnitX(u)-x)+360.,360.)
        if a<=a2 and a>=a1 then
            call GroupAddUnit(whichGroup,u)
        endif
    endloop
    call DestroyGroup(g)
    set g=null
endfunction
0<=a1<=a2<=360
Старый 19.06.2011, 22:40
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
» Осторожно, Опасно для зрения!!! Чистый JASS!!!

Функция PointInSector возвращает входит ли точка в сектор окружности
vecAng - угол вектора (взгляд кастера например)
sector - величина угла сектора
Radius - радиус окружности
X,Y - координаты центра окружности
uX,uY - координаты точки для проверки
Все углы нужно передавать в радианах (для перевода домножить на константу bj_DEGTORAD)
Код:
function AngleBPoint takes real x1, real y1, real x2, real y2 returns real
 return Atan2(y2-y1,x2-x1)
endfunction
function Dist takes real x1, real y1, real x2, real y2 returns real
 return SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
endfunction
function PointInSector takes real vecAng, real sector, real Radius, real X, real Y, real uX, real uY returns boolean
 local real a1 = AngleBPoint(X,Y,uX,uY)
 return (Dist(X,Y,uX,uY) <= Radius) and (vecAng+sector/2 >= a1) and (a1 <= vecAng-sector/2)
endfunction

Старый 20.06.2011, 11:14
vladfaust

offline
Опыт: 12,714
Активность:
Все углы нужно передавать в радианах (для перевода домножить на константу bj_DEGTORAD)
GetUnitFacing() не радианы?
Старый 20.06.2011, 11:41
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
неа
Старый 20.06.2011, 11:53
Ответ

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

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

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

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



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