Область 1 содержит (отряд 1)
нужно чтобы по истечению времени в области 2 появился (отряд 1)
но в том же положении, знает кто как реализовать через гуи . ( положения будут разные , не только как в 1 скрине)

Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
4
сделать две области одинакового размера, для каждого юнита отлавливать его координаты\расстояние от центра, либо угла области. Перенося юнита на вторую область использовать данные с 1.
28
отлавливать его координаты\расстояние от центра
По подробней как отловить координаты от центра области?
32
Roy Mustang, GetRectCenterX\Y на гуи CenterOfRegoin или как то так.
так же есть функции которые позволяют узнать макс и мин x\y
27
GetRectMinX(R)
GetRectMaxX(R)
GetRectMinY(R)
GetRectMaxY(R)
вот пример
тфу перепроверил дважды
X = GetUnitX(u) //координаты юнита
Y = GetUnitY(u)
X1 = GetRectCenterX(R1) - X //разница на осях относительно ректа R1, точнее от его центра. 
Y1 = GetRectCenterY(R1) - Y
X2 = GetRectCenterX(R2) - X1 //относительность от центра R2, по этим координатам смещаешь
Y2 = GetRectCenterY(R2) - Y1
так делаешь с каждым юнитом
28
Steal nerves:
Но что писать при создание юнита ( в какие координаты)
Сделал так, думаю много что не правильно , (ибо не работает правильно)
(я очень слабо разбираюсь в триггерах и могу многое начудить)
27
Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
Загруженные файлы
Принятый ответ
27
Вот еще один пример. Область - проще говоря это прямоугольник. А представьте, что, если у каждого прямоугольника, как и у юнита, был угол поворота, то есть туда куда смотрит (вверх - 90 град, вниз - 270, влево - 180, вправо - 360). Короче говоря прямоугольник можно было перевернуть как шахматную доску на определенный угол. Проблема в том, что у каждой области угол разный (у одного прямоугольника 90 град, значит помещаешь юнитов лицом вверх. А спавнишь лицом вниз, так как у другого прямоугольника 270 град)
код
код получился такой. С тригонометрией проблеммы, мб функция Atan2 быстрее помогла.

//угол между двумя углами. Взята на сайте в разделе Алгоритмы
function GetAngleDifference takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 - a1 > a1 - x) then
        set a2 = x
    endif
    return RAbsBJ(a1 - a2)
endfunction

//функцию GetAngle можно удалить, она была расчитана на то, что значения угла будут от 0 до 360 градусов. Типа может быть так, что значения попадаться будет не те. 7200 градусов - это 20 оборотов, или -7200 градусов - 20 оборотов в другую сторону. Эту функция не пригодилась и была недоделана  Не пригодится так как углы поворота прямоугольникам мы сами задаем, и поэтому не может быть такого
function GetAngle takes real a returns real

local real B = a

if B > 6.28 then //6.28 радиан - 0 градусов или 360 градусов
loop
exitwhen (B <= 6.28)
set B = B - 6.28
endloop
elseif B < 0 then
loop
exitwhen (B >= 0)
set B = B + 6.28
endloop

endif

return B
endfunction

//Функция SinX определяет знаки по чертвертям (1 и 2 четверть положительный знак, а другие две четверти отрицательны). Вычисление проводить в радианах.
function SinX takes real angle returns real
local real s= angle //GetAngle(angle)
if s > 0 and s < 3.14 and s < 6.28 then //3.14 радиан - число Пи или 180 градусов, 6.28 радиан - число "2 Пи" или 0 (360) градусов
return 1
elseif s > 3.14 and s < 6.28 then 
return (-1)
endif
endfunction

//Функция SinB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function SinB takes real angle returns real
local real s= Sin(angle)
if s == 0 then //Если получается ноль, то ставим 1
return 1
else //Иначе оставляем все без изменений, только знак угла нужно вычислить
return s *SinX(angle)
endif
endfunction

//Функция CosX определяет знаки по чертвертям (2 и 3 четверть положительный знак, а другие две четверти (1 и 4) отрицательны). Вычисление проводить в радианах.
function CosX takes real angle returns real
local real s = angle //= GetAngle(angle)
if s > 1.57 and s < 4.71 then //1.57 радиан = Пи/2 или 90 градусов, 4.71 радиан = 2Пи или 270 градусов 
return 1
else
return (-1.)
endif
endfunction


//Функция CosB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function CosB takes real angle returns real
local real c= Cos(angle)
if c == 0 then //Если получается ноль, то ставим 1
return 1
else  //Иначе оставляем все без изменений, только знак угла нужно вычислить
return c *CosX(angle)
endif
endfunction


function TZZ takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T1) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T1)
local real Tx2 = GetRectCenterX(gg_rct_T2) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T2)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 90. //направление второго прямоугольника вверх 90 градусов, точнее спавн вверх. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо, по часовой стрелки "+", либо влево, против часовой стрелки "-"), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,90), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем ввверх на 180 градусов (из отметки 270 градусов поворачиваем к отметке 90 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx* CosB( A )//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dy* SinB( A )//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 - Dx//смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 - Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата X: " + R2S(  Dx    ))
call BJDebugMsg("Координата У: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction

function TXX takes nothing returns nothing
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T1), null)
    call ForGroup( bj_lastCreatedGroup, function TZZ )
    call GroupClear(bj_lastCreatedGroup)
endfunction

//===========================================================================
function InitTrig_ZZZ takes nothing returns nothing
    set gg_trg_ZZZ = CreateTrigger(  )
    set bj_lastCreatedGroup = CreateGroup()
    call TriggerRegisterTimerEventPeriodic( gg_trg_ZZZ, 10.00 )
    call TriggerAddAction( gg_trg_ZZZ, function TXX )
endfunction
Загруженные файлы
28
Steal nerves:
я не знаю Jass , но все же посмотрю систему, любой пример пригодится
27
Roy Mustang, ок, тебя понял. но только сейчас заметил ошибку в моем коде. Сверху вниз или снизу вверх норм поворачивает, а вот слева направо (поворот на 90 градусов), что-то не то получается (не туда спавнится). Пробую исправить как часа 2, что-то не знаю как
Все исправил свою ошибку
вот код

//угол между двумя углами. Взята на сайте в разделе Алгоритмы
function GetAngleDifference takes real a1, real a2 returns real
    local real x
    set a1 = ModuloReal(a1, 360)
    set a2 = ModuloReal(a2, 360)
    if (a1 > a2) then
        set x = a1
        set a1 = a2
        set a2 = x
    endif
    set x = a2 - 360
    if (a2 - a1 > a1 - x) then
        set a2 = x
    endif
    return RAbsBJ(a1 - a2)
endfunction

//функцию GetAngle можно удалить, она была расчитана на то, что значения угла будут от 0 до 360 градусов. Типа может быть так, что значения попадаться будет не те. 7200 градусов - это 20 оборотов, или -7200 градусов - 20 оборотов в другую сторону. Эту функция не пригодилась и была недоделана 
function GetAngle takes real a returns real

local real B = a

if B > 6.28 then //6.28 радиан - 0 градусов или 360 градусов
loop
exitwhen (B <= 6.28)
set B = B - 6.28
endloop
elseif B < 0 then
loop
exitwhen (B >= 0)
set B = B + 6.28
endloop

endif

return B
endfunction

//Функция SinX определяет знаки по чертвертям (1 и 2 четверть положительный знак, а другие две четверти отрицательны). Вычисление проводить в радианах.
function SinX takes real angle returns real
local real s= angle //GetAngle(angle)
if s > 3.14 and s < 6.28 then  //3.14 радиан - число Пи или 180 градусов, 6.28 радиан - число "2 Пи" или 0 (360) градусов
return (-1)
else
return (1)
endif
endfunction

//Функция SinB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function SinB takes real angle returns real
local real s= Sin(angle)
if s == 0 then //Если получается ноль, то ставим 1
return 1
else //Иначе оставляем все без изменений, только знак угла нужно вычислить
return s *SinX(angle)
endif
endfunction

//Функция CosX определяет знаки по чертвертям (2 и 3 четверть положительный знак, а другие две четверти (1 и 4) отрицательны). Вычисление проводить в радианах.
function CosX takes real angle returns real
local real s = angle //= GetAngle(angle)
if s > 1.57 and s < 4.71 then //1.57 радиан = Пи/2 или 90 градусов, 4.71 радиан = 2Пи или 270 градусов 
return 1
else
return (-1.)
endif
endfunction


//Функция CosB позволяет убрать нули, точнее когда значение равно нулю. Иначе сбивает всю систему координат. Вычисление проводить в радианах.
function CosB takes real angle returns real
local real c= Cos(angle)
if c == 0 then //Если получается ноль, то ставим 1
return 1
else  //Иначе оставляем все без изменений, только знак угла нужно вычислить
return c *CosX(angle)
endif
endfunction


function TZX takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T3) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T3)
local real Tx2 = GetRectCenterX(gg_rct_T4) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T4)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 360. //направление второго прямоугольника вправо 360 градусов, точнее спавн вправо. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо +, либо влево -), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,360), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем вправо на 90 градусов (из отметки 270 градусов поворачиваем к отметке 360 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx * Cos(A) - dy * Sin(A)//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dx * Sin(A) + dy * Cos(A)//dy* SinB( A )//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 + Dx //смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 + Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата dy: " + R2S(  dy    ))
call BJDebugMsg("Координата X: " + R2S(  Dx    ))
call BJDebugMsg("Координата У: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction


function TZZ takes nothing returns nothing
local real Ux = GetUnitX(GetEnumUnit()) //координаты юнита
local real Uy = GetUnitY(GetEnumUnit())
local real Tx1 = GetRectCenterX(gg_rct_T1) //координаты первого прямоугольника, точнее координаты центра (x,y)
local real Ty1 = GetRectCenterY(gg_rct_T1)
local real Tx2 = GetRectCenterX(gg_rct_T2) //координаты второго прямоугольника, точнее координаты центра (x,y)
local real Ty2 = GetRectCenterY(gg_rct_T2)
local real A1 = 270. //направление первого прямоугольника вниз 270 градусов, точнее куда нужно смотреть. Мы распологаем на прямоугольную площадку юнитов.
local real A2 = 90. //направление второго прямоугольника вверх 90 градусов, точнее спавн вверх. Это как если вы перевернули прямоугольник.
local real dx = Ux - Tx1 //направление вектора (ось x), из конца вычитаем начало
local real dy = Uy - Ty1 //направление вектора (ось y), из конца вычитаем начало


local real angle = A2-A1//этот angle - угол, на которое требует повернуть (либо вправо +, либо влево -), чтобы получился угол A2. Желательно, минимальный угол.
//значение угла можно определить функцией GetAngleDifference(270,90), так тоже будет правильно. Разницы нет никакой. Только вот в GetAngleDifference определяет минимальный угол, но это может сбить знак угла, вот чего боюсь. Пока отклонений не наблюдал
//поворачиваем ввверх на 180 градусов (из отметки 270 градусов поворачиваем к отметке 90 градусам)

local real A = (angle*bj_DEGTORAD)//переводим из градусов в радианы



local real Dx = dx * Cos(A) - dy * Sin(A)//расстояние относительно от центра Tx1 на оси x с учетом поворота на угол А
local real Dy = dx * Sin(A) + dy * Cos(A)//расстояние относительно от центра Ty1 на оси y с учетом поворота на угол А

local real Sx = Tx2 + Dx//смещение от центра Tx2 на расстояние Dx
local real Sy = Ty2 + Dy//смещение от центра Ty2 на расстояние Dy


//дебаг
call BJDebugMsg("Координата DX: " + R2S(  Dx    ))
call BJDebugMsg("Координата DУ: " + R2S(  Dy    ))
call BJDebugMsg("Координата SX: " + R2S(  Sx    ))
call BJDebugMsg("Координата SУ: " + R2S(  Sy    ))

//либо спавним нового юнита

call CreateUnit(GetOwningPlayer(GetEnumUnit()),GetUnitTypeId(GetEnumUnit()), Sx, Sy, GetUnitFacing(GetEnumUnit())+angle)


//либо самого юнита перемещаем (пока эта возможность отключил)

//call SetUnitX(GetEnumUnit(),Sx)
//call SetUnitY(GetEnumUnit(),Sy)
//call SetUnitFacing(GetEnumUnit(),GetUnitFacing(GetEnumUnit())+angle)
endfunction

function TXX takes nothing returns nothing
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T1), null)
    call ForGroup( bj_lastCreatedGroup, function TZZ )
    call GroupClear(bj_lastCreatedGroup)
    call GroupEnumUnitsInRect(bj_lastCreatedGroup,(gg_rct_T3), null)
    call ForGroup( bj_lastCreatedGroup, function TZX )
    call GroupClear(bj_lastCreatedGroup)
endfunction

//===========================================================================
function InitTrig_ZZZ takes nothing returns nothing
    set gg_trg_ZZZ = CreateTrigger(  )
    set bj_lastCreatedGroup = CreateGroup()
    call TriggerRegisterTimerEventPeriodic( gg_trg_ZZZ, 10.00 )
    call TriggerAddAction( gg_trg_ZZZ, function TXX )
endfunction
помогла инфа
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.