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

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

Закрытая тема
 
Extremator

offline
Опыт: 39,522
Активность:
Вопрос к знатокам (проверка области на содержание юнита/точки)
Обычно я делаю так... set Point = (...) и потом удаляю
если я проверяю точку то всё понятно...
а если я проверяю содержит ли область юнита, то что проверяется сам триггер?
юнита в области? ... или же точку под ним? (которая может утекать ... или нет?)
Старый 13.12.2011, 09:42
MyRtZ

offline
Опыт: 6,530
Активность:
Extremator:
Обычно я делаю так... set Point = (...) и потом удаляю
если я проверяю точку то всё понятно...
а если я проверяю содержит ли область юнита, то что проверяется сам триггер?
юнита в области? ... или же точку под ним? (которая может утекать ... или нет?)
Проверка ForGroup происходит без точек. Если делать через GUI( ForGroupBJ ), то там по стандартам утекает созданная группа. Перед вызовом надо устанавливать переменную bj_wantDestroyGroup на тру значение, если область в дальнейшем не задействована, да бы утечек не возникало.
Старый 13.12.2011, 09:55
Extremator

offline
Опыт: 39,522
Активность:
MyRtZ:
да бы утечек не возникало.
т.е. если я тыкаю проверку ("юнит в пределах игровой карты" = да) то создаётся группа и идёт утечка... верно?
MyRtZ:
если область в дальнейшем не задействована,
вот это меня смутило о_О как так ... не задействована в дальнейшем
Старый 13.12.2011, 09:59
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
function RectContainsUnit takes rect r, unit whichUnit returns boolean
    return RectContainsCoords(r, GetUnitX(whichUnit), GetUnitY(whichUnit))
endfunction
гляди функции из гуи в джаззе, и увидишь есть там утечки или нет
Старый 13.12.2011, 09:59
Extremator

offline
Опыт: 39,522
Активность:
я просто делаю триггерный мув юнита и проверку на то что он ещё в пределах карты...
ну что бы всякие кнокбеки не выкинули меня за карту...
я так понял, что легче проверять точку куда хочу сдвинуть на то входит ли он в область, или нет... верно?
Extremator добавил:
16GB:
гляди функции из гуи в джаззе, и увидишь есть там утечки или нет
в том то и дело что я этого не понимаю... поэтому и спрашиваю у вас тут :(
Старый 13.12.2011, 10:01
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Extremator:
я просто делаю триггерный мув юнита и проверку на то что он ещё в пределах карты...
если ты двигаешь через setunitposition то он не вылетит по любому, а если SetUnitX/Y то юзай вот
function SafeX takes real pxx returns real
local real lfr=GetRectMinX(bj_mapInitialPlayableArea)+50
if(pxx<lfr)then
return lfr
endif
set lfr=GetRectMaxX(bj_mapInitialPlayableArea)-50
if(pxx>lfr)then
return lfr
endif
return pxx
endfunction

function SafeY takes real pyy returns real
local real lfr=GetRectMinY(bj_mapInitialPlayableArea)+50
if(pyy<lfr)then
return lfr
endif
set lfr=GetRectMaxY(bj_mapInitialPlayableArea)-50
if(pyy>lfr)then
return lfr
endif
return pyy
endfunction
юзается так
set R = Atan2(b-GetUnitY(u),a-GetUnitX(u))
call SetUnitX(u,SafeX(GetUnitX(u)+50.*Cos(R)))
call SetUnitY(u,SafeY(GetUnitY(u)+50.*Sin(R)))
Старый 13.12.2011, 10:03
MyRtZ

offline
Опыт: 6,530
Активность:
Extremator:
MyRtZ:
да бы утечек не возникало.
т.е. если я тыкаю проверку ("юнит в пределах игровой карты" = да) то создаётся группа и идёт утечка... верно?
Проверку с группой не путай, в любом случае, есть ли твоя проверка или нет - группа она создается, если в аргументах вызова не передается перменная с уже имеющейся группой.
Тут два способа:
  1. Ты создаешь группу в начале функции и вносишь ее в переменную после используешь ее, в конце при необходимости удаляешь;
  2. Ты пишешь, как я сказал, "bj_wantDestroyGroup на тру значение" до вызова.
>
MyRtZ:
если область в дальнейшем не задействована,
вот это меня смутило о_О как так ... не задействована в дальнейшем
Делай по второму способу
MyRtZ добавил:
~16GB:
Extremator:
я просто делаю триггерный мув юнита и проверку на то что он ещё в пределах карты...
если ты двигаешь через setunitposition то он не вылетит по любому, а если SetUnitX/Y то юзай вот
GetRectMinX(bj_mapInitialPlayableArea)+50
GetRectMaxX(bj_mapInitialPlayableArea)-50
GetRectMinY(bj_mapInitialPlayableArea)+50
GetRectMaxY(bj_mapInitialPlayableArea)-50
Эти операции вносятся в переменную, в функции проверки их не используют, если задействована стрела, фаербол или др. объекты которые перемещаются каждые (0.01-0.02), это снижает нагрузку
MyRtZ добавил:
Я в совей карте это делал так:
define
  maxbound.bonus_d = 150.
enddefine

function UnitXY takes unit u,real x,real y returns boolean
  call SetUnitX(u,x)
  call SetUnitY(u,y)
  return x>PLX[20]or x<PLX[21]or y>PLX[22]or y<PLX[23]
endfunction

//при инициализации:
set PLX[20]=GetRectMaxX(bj_mapInitialPlayableArea) + maxbound.bonus_d
set PLX[21]=GetRectMinX(bj_mapInitialPlayableArea) + maxbound.bonus_d
set PLX[22]=GetRectMaxY(bj_mapInitialPlayableArea) + maxbound.bonus_d
set PLX[23]=GetRectMinY(bj_mapInitialPlayableArea) + maxbound.bonus_d
Если UnitXY возвращает true, то юнит ремувится, за карту вылитали только снаряды
Старый 13.12.2011, 10:25
yellyex

offline
Опыт: 4,667
Активность:
Extremator, MyRtZ, 16GB, Блин, вас бы всех к моим проблемам... Их бы у меня тогда небыло.
Старый 13.12.2011, 10:28
Extremator

offline
Опыт: 39,522
Активность:
16GB:
если ты двигаешь через setunitposition то он не вылетит по любому, а если SetUnitX/Y то юзай вот
для успешной проходимости я отключаю колюзию юнита перед тем как его сместить...
т.е. - я могу выталкнуть его за карту...
MyRtZ:
в любом случае, есть ли твоя проверка или нет - группа она создается
ну а если я буду не юнита проверять на наличие в области...
а создам точку в позиции юнита... и проверю входит ли она в область "игровая карта" ... группа же не создаётся?
Старый 13.12.2011, 10:31
MyRtZ

offline
Опыт: 6,530
Активность:
Extremator:
MyRtZ:
в любом случае, есть ли твоя проверка или нет - группа она создается
ну а если я буду не юнита проверять на наличие в области...
а создам точку в позиции юнита... и проверю входит ли она в область "игровая карта" ... группа же не создаётся?
не создается. А вообще лучше используй метод проверки предоставленный 16GB.
MyRtZ добавил:
сейчас напишу для тебя упрощенную функцию
Старый 13.12.2011, 10:35
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
группа не нужна, локация тоже. Надо 2 координаты которые получаются через GetUnitX/Y и 4 значения, которые получаются через GetRectMax/MinX/Y
Старый 13.12.2011, 10:35
Extremator

offline
Опыт: 39,522
Активность:
короче я делаю вот так
вместо (Triggering Unit) у меня конкретный юнит из переменной
я просто вяреза всё кроме основной сути моих действия косаемых движения
Миниатюры
Кликните на картинку для увеличения
Название:  1.PNG
Просмотров: 11
Размер:  17.4 Кбайт  
Старый 13.12.2011, 10:40
MyRtZ

offline
Опыт: 6,530
Активность:
globals
    real BoundXmin
    real BoundXmax
    real BoundYmin
    real BoundYmax
//предпочительней 'array', для читаемости сделаю так.
endglobals

define
    bound.bonus = 99.
enddefine

function InitSystem takes nothing returns nothing
    set BoundXmax = GetRectMaxX(bj_mapInitialPlayableArea) + bound.bonus
    set BoundXmin = GetRectMinX(bj_mapInitialPlayableArea) + bound.bonus
    set BoundYmax = GetRectMaxY(bj_mapInitialPlayableArea) + bound.bonus
    set BoundYmin = GetRectMinY(bj_mapInitialPlayableArea) + bound.bonus
endfunction

function SetUnitXY takes unit u, real x, real y returns nothing
    if (x > BoundXmin) then
        if (x < BoundXmax) then
            call SetUnitX(u,x)
        else
            call SetUnitX(u,BoundXmax)
        endif
    else
        call SetUnitX(u,BoundXmin)
    endif
    if (y > BoundYmin) then
        if (y < BoundYmax) then
            call SetUnitY(u,y)
        else
            call SetUnitY(u,BoundYmax)
        endif
    else
        call SetUnitY(u,BoundYmin)
    endif
endfunction
Не разбираешься в Jass?
Старый 13.12.2011, 10:43
Extremator

offline
Опыт: 39,522
Активность:
MyRtZ:
Не разбираешься в Jass?
так точно, Сир :D
Старый 13.12.2011, 10:44
MyRtZ

offline
Опыт: 6,530
Активность:
Профессионал написал бы так:
globals
    real array MapBounds
endglobals

define
    bound.bonus = 99.
    BoundXmin = MapBounds[0]
    BoundXmax = MapBounds[1]
    BoundYmin = MapBounds[2]
    BoundYmax = MapBounds[3]
enddefine

function InitSystem takes nothing returns nothing
    set BoundXmax = GetRectMaxX(bj_mapInitialPlayableArea) + bound.bonus
    set BoundXmin = GetRectMinX(bj_mapInitialPlayableArea) + bound.bonus
    set BoundYmax = GetRectMaxY(bj_mapInitialPlayableArea) + bound.bonus
    set BoundYmin = GetRectMinY(bj_mapInitialPlayableArea) + bound.bonus
endfunction

function SetUnitXY takes unit u, real x, real y returns nothing
    if (x > BoundXmin) then
        if (x < BoundXmax) then
            call SetUnitX(u,x)
        else
            call SetUnitX(u,BoundXmax)
        endif
    else
        call SetUnitX(u,BoundXmin)
    endif
    if (y > BoundYmin) then
        if (y < BoundYmax) then
            call SetUnitY(u,y)
        else
            call SetUnitY(u,BoundYmax)
        endif
    else
        call SetUnitY(u,BoundYmin)
    endif
endfunction
MyRtZ добавил:
Extremator:
MyRtZ:
Не разбираешься в Jass?
так точно, Сир :D
Это легко используется через "CustomScript".
Старый 13.12.2011, 10:45
Extremator

offline
Опыт: 39,522
Активность:
MyRtZ:
Это легко используется через "CustomScript".
знаю... тогда легче переходить на Jass... а я не хочу...
поэтому стараюсь делать как можно более правельно и безутечно на GUI
Старый 13.12.2011, 10:46
MyRtZ

offline
Опыт: 6,530
Активность:
Сейчас научу)
Старый 13.12.2011, 10:46
Extremator

offline
Опыт: 39,522
Активность:
MyRtZ:
Сейчас научу)
не нада :D мне бы только знать что я правельна делаю, и всё
Старый 13.12.2011, 10:47
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
массивы работают чуть медленнее чем обычная переменная, памяти потребляет столько же или чуть больше. Доступа по индексу и циклической обработки тут нигде нет, и используются дефайны. У меня такой вопрос - чем же в данном случае предпочтительнее массив?
FellGuard добавил:
имхо первый вариант был лучше той пляски с бубном, чем второй с дефайном
Старый 13.12.2011, 10:48
MyRtZ

offline
Опыт: 6,530
Активность:
FellGuard:
У меня такой вопрос - чем же в данном случае предпочтительнее массив
Ты сам ответил на свой вопрос:
"памяти потребляет столько же или чуть больше";
Создают "переменные"(как показано на примере) на основе массива через дэфайны. Через дэфайны для того чтобы код был понятен
Старый 13.12.2011, 10:49
Закрытая тема

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

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

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

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



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