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

Лучший ответ:
Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.



Просмотров: 262

Steal nerves #1 - 3 недели назад 0
quq_CCCP #2 - 3 недели назад 0
Лтд еще одна?
Daniil18 #3 - 3 недели назад 0
сделать две области одинакового размера, для каждого юнита отлавливать его координаты\расстояние от центра, либо угла области. Перенося юнита на вторую область использовать данные с 1.
Roy Mustang #4 - 3 недели назад (отредактировано ) 0
отлавливать его координаты\расстояние от центра
По подробней как отловить координаты от центра области?
quq_CCCP #5 - 3 недели назад 0
Roy Mustang, GetRectCenterX\Y на гуи CenterOfRegoin или как то так.
так же есть функции которые позволяют узнать макс и мин x\y
Steal nerves #6 - 3 недели назад (отредактировано ) 0
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
так делаешь с каждым юнитом
Roy Mustang #7 - 3 недели назад (отредактировано ) 0
Steal nerves:
Но что писать при создание юнита ( в какие координаты)
Сделал так, думаю много что не правильно , (ибо не работает правильно)
(я очень слабо разбираюсь в триггерах и могу многое начудить)
прикреплены файлы
Steal nerves #8 - 3 недели назад (отредактировано ) 1

Эхх. Ты неправильно делаешь (конечно все будет по-другому, те команды дадут другой результат. Конвентируй в код и посмотри). думаю объяснить сложнее будет. Сделал на гуи спавн как в холли вар (Holy War). Как встанут, так и будут вспавниться (хоть спиной, хоть боком стань). Правда кривенько. Но надо потом обязательно подучить хорошенько и на джаз тебе переходить потом
ps а и группу удалять не забывай. мой косяк. Мог бы на гуи норм сделать, но у меня не скачан jngp. Как мне помнится, еще эта команда "Unit in (Rect) " утечна, локалки в ней не обнуляются вроде и создает заново группу. А можно на джаз с одной группой работать, не создавая новые, просто будет пик в группу.
прикреплены файлы
Roy Mustang #9 - 3 недели назад 1
Steal nerves:
Очень благодарен за пример
Steal nerves #10 - 1 неделю назад (отредактировано ) 1
Вот еще один пример. Область - проще говоря это прямоугольник. А представьте, что, если у каждого прямоугольника, как и у юнита, был угол поворота, то есть туда куда смотрит (вверх - 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
прикреплены файлы
Roy Mustang #11 - 1 неделю назад 1
Steal nerves:
я не знаю Jass , но все же посмотрю систему, любой пример пригодится
Steal nerves #12 - 1 неделю назад (отредактировано ) 0
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
помогла инфа
прикреплены файлы