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

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

Ответ
 
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Вызывает ли это утечки?
Каждые две секунды происходит триггер в котором есть такое действие:
Set Random Point = (Random point in ( Region Centered at( Position of Marine[Playernumber...bla.bla)) with size (4000,4000)
Но меня волнует ещё - Region Centered at (...) size (....,...)
Этот триггер у меня происходит каждые 2 секунды... и получается что каждые 2 секунды в памяти создаётся заново этот регион.
Естественно в конце этого триггера стоит.
call RemoveLocation(udg_RandomPoint) - Но ведь ещё же тут используется Region Centered At...
Так вот мне интересно... его надо как-то удалять.... чтобы он не вызывал утечек?
Можно создать новую переменную региона(Rect), но какой коммандой удаляется регион?

Отредактировано Ranger21, 12.01.2009 в 18:35.
Старый 12.01.2009, 18:07
Gres
Кораэлестраз
offline
Опыт: 18,575
Активность:
Помойму регион нужно не обнулять, а удалять! Действием: call RemoveLocation(твоя локация)
Старый 12.01.2009, 18:32
StMechanus
Дух сети
offline
Опыт: 11,608
Активность:
Я так понял регион у тебя это переменная, насколько я помню? - Если да то создай пустой триггер с действием CS g (например), выключи и включи триггер - должно выдать ошибку, в самому верху есть пункт Global Variables. Поищи там свою переменню - справа будет написано 0 или null. Потом в своем триггере напиши CS set udg_твоя переменная = null
Старый 12.01.2009, 18:33
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Gres То есть у региона и у точки одна и таже комманда удаления?)

Там есть переменная Rect,

Я имел ввиду не обнуление... а удаление).... я его локалкой делать врятли буду

Вот если перевести триггер в текст то выглядит так:

Код:
function Trig_SpawnGhoul_Conditions takes nothing returns boolean
    if ( not ( CountLivingPlayerUnitsOfTypeId('u001', Player(11)) < 100 ) ) then
        return false
    endif
    return true
endfunction

function Trig_SpawnGhoul_Func005001 takes nothing returns boolean
    return ( CountUnitsInGroup(GetUnitsOfTypeIdAll('u000')) <= 12 )
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
    set udg_RandomPoint = GetRandomLocInRect(RectFromCenterSizeBJ(GetUnitLoc(udg_Marine[( GetConvertedPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)])) - 1 )]), 4000.00, 4000.00))
    set udg_RandomPointSpaw3 = GetRandomLocInRect(gg_rct_ZombieSpaw3)
    call CreateNUnitsAtLoc( 4, 'u001', Player(11), udg_RandomPoint, bj_UNIT_FACING )
    if ( Trig_SpawnGhoul_Func005001() ) then
        call CreateNUnitsAtLoc( 1, 'u000', Player(11), udg_RandomPointSpaw3, bj_UNIT_FACING )
    else
        call DoNothing(  )
    endif
    call RemoveLocation(udg_RandomPoint)
    call RemoveLocation(udg_RandomPointSpaw3)
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call DisableTrigger( gg_trg_SpawnGhoul )
    call TriggerRegisterTimerEventPeriodic( gg_trg_SpawnGhoul, 2.00 )
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction


Всё работает отлично... ток я вот думаю утечки тут точно есть
Старый 12.01.2009, 18:34
StMechanus
Дух сети
offline
Опыт: 11,608
Активность:
Вроде утечек не должно быть - команда "очищения" точки есть)
Старый 12.01.2009, 18:37
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Djok У меня периодически присваивается рандомная точка в рандомном регионе...

Точка находиться в переменной... а регион этот - нет.

Наверно надо сделать регион переменной и потом его удалять?
Старый 12.01.2009, 18:38
StMechanus
Дух сети
offline
Опыт: 11,608
Активность:
нет не надо - у тебя все нормально, утечек быть не должно

Djok добавил:
ты же не создаешь каждые 2 сек регион)
Старый 12.01.2009, 18:42
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
Код:
Set Random Point = (Random point in ( Region Centered at( Position of Marine[Playernumber...bla.bla)) with size (4000,4000)

Random Point in - создаёт точку
Region Centered at - создаёт регион
Position of - создаёт точку
Создаётся три объекта. Если их больше нигде не используешь, их надо удалять.
Старый 12.01.2009, 18:43
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Djok

Как раз каждые 2 сек и выходит... он же рандомно каждые 2 сек создаётся. Пока не накопиться 100 юнитов...)

DFlyer

Уууу... даже три утечки выходит) щас тогда всё это в переменные занесу. А можно ли код на джассе пооптимизированее написать? Обычный триггерный код я выше написал...

PS: использую их только в этом тригере
Старый 12.01.2009, 18:46
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
Ranger21
Что такое
Код:
udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)]))]

?

Что вообще должен делать триггер?

Вот, исправил чуток. Сделал без всяких лишних локаций.
» OptimizedCode
Код:
function Trig_SpawnGhoul_Conditions takes nothing returns boolean
    return CountLivingPlayerUnitsOfTypeId('u001', Player(11)) < 100
endfunction

function Trig_SpawnGhoul_Func005001 takes nothing returns boolean
    return CountUnitsInGroup(GetUnitsOfTypeIdAll('u000')) <= 12
endfunction

function RectByCenter takes unit u, real width, real height returns rect
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    return Rect(x-width*0.5,y-height*0.5,x+width*0.5,y+height*0.5)
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
    local rect rct = RectByCenter(udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)])))], 40., 40. )
    local real x = GetRandomReal(GetRectMinX(rct),GetRectMaxX(rct))
    local real y = GetRandomReal(GetRectMinY(rct),GetRectMaxY(rct))
    local integer i=0
    
    loop
        set i=i+1
        call CreateUnit(Player(11),'u001',x,y,270.)
        exitwhen i==4
    endloop
    if Trig_SpawnGhoul_Func005001() then
        set x = GetRandomReal(GetRectMinX(gg_rct_ZombieSpaw3),GetRectMaxX(gg_rct_ZombieSpaw3))
        set y = GetRandomReal(GetRectMinY(gg_rct_ZombieSpaw3),GetRectMaxY(gg_rct_ZombieSpaw3))
        call CreateUnit(Player(11),'u000',x,y,270.)
    endif
    
    call RemoveRect(rct)
    set rct=null
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call DisableTrigger( gg_trg_SpawnGhoul )
    call TriggerRegisterTimerEventPeriodic( gg_trg_SpawnGhoul, 2.00 )
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction

Отредактировано DFlyer, 12.01.2009 в 19:54.
Старый 12.01.2009, 19:48
Harakternyk

offline
Опыт: 2,703
Активность:
По обсуждаемому и в общем хочу лишь заметить, что именно функции типа Remove и выводят ненужный более объект из игры - обнулeние переменных имеет смысл лишь тогда, когда с их помощью какой-то объект создавалася, например:

Код:
local texttag tt = CreateTextTag() 
local timer tm = CreateTimer()
local trigger tg = CreateTrigger()


потому что в обратном случае, т.е., когда этими переменными объект не создаётся, обнуление переменной, ссылающейся на такой объект, не приведёт к её удалению из памяти игры.
Старый 12.01.2009, 20:12
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)]))]
Ну вообще я просто запутался ... маринов 6.... у переменной отчёт с 0. :)
Вот я и сделал с 0 до 5 рандомное число.

То есть короче говоря... каждый раз... из переменной ( Она уже задана в другом триггере и не меняется всю игру(если игроки не ливают или погибают)) берётся юнит игрока которым он уже играет ( находиться на карте) и около этого игрока создаётся регион размером 4000 на 4000 в котором появляются 4 зомби.

Так же как заметил... в этом триггере спавнятся некромансеры :)... но они спавнятся только в определённом участке который уже создан в редакторе.

Проще говоря... просто я не хочу привязывать это к определённому типу юнитов... так как игрок может играть разными типами юнитов.


PS: Спасибо огромное... триггер отлично работает!

Ranger21 добавил:
Ещё вопросик... как реализовать в этом же триггере проверку на наличие юнитов в Marine[0-5] ? Просто надо чтобы юниты создавались всегда около играющих игроков (игрока)

Ranger21 добавил:
Вообщем... триггер работает отлично только для первого игрока.
Для 2ого игрока - часть зомби создаются в левом месте.
Для 3ого игрока - ещё больше зомби создаются в левом месте.
Для 4ого игрока - ещё ещё больше зомби создаются в другом месте... не рядом с пехотинцами в районе 4000x4000
Для 5ого.... - ещё..... ещё....

Для 6ого - все Зомби создаются в левом месте.


Вообщем надо как-то внести проверку есть ли юнит в игре или нету.


Как я понял... просто у первого игрока он работает отлично... потому что видит... что первый игрок играет и дальше не идёт перебирать...


PS: Marine [0-5], игроков 6. У первого игрока - Marine[0] , второго [1], 3 - [2], 4-[3], 5 - [4] , 6 - [5].

Незнаю я как проверку делать на наличии юнита в переменной(

Ranger21 добавил:
Всё пытаюсь... проверка не выходит=)

Отредактировано Ranger21, 12.01.2009 в 20:40.
Старый 12.01.2009, 22:19
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
Код:
local integer i = 0
loop
    if Marine[Player(i)]!=null then
    // твои действия по созданию юнитов
    endif
    set i:=i+1
    exitwhen i>6
endloop
Старый 12.01.2009, 22:24
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
DFlyer Да.... только действия по созданию юнитов это же тоже цикл ?
Код:
loop
        set i=i+1
        call CreateUnit(Player(11),'u001',x,y,270.)
        exitwhen i==4
  endloop


Выйдет глюк =0 Хотя допустим мы без цикла этого...( ненадо создавать сразу 4ех зомби - хотя мне желательно)

Но разве после этой проверки будут создаваться регионы для создания зомби около пехотинцы 6ого игрока? Они и щас не создаются... почему-то...

Код:
local rect rct = RectByCenter(udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)])))], 4000, 4000 )


Мне же надо эту проверку в этот триггер
Старый 12.01.2009, 22:31
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
Цитата:
Выйдет глюк =0

Ну дак создай цикл внутри цикла. Просто заюзай другую переменную вместо i.
Старый 12.01.2009, 22:45
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
DFlyer

Цикл явно не туда надо вставлять...( Проверил в игре... всё равно происходит тоже самое) вся проблема в этой строчке

local rect rct = RectByCenter(udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[GetRandomInt(0, 5)])))], 4000, 4000 )

Регион не должен создаваться если переменная = null

А у меня тут стоит [GetRandomInt(0, 5)]..... то есть регион так или иначе создаётся рандомно... а он должен создаваться только там где переменная !=(не равна) null

Но перед локалкой if не поставишь(
Старый 12.01.2009, 23:09
DFlyer
<3 MJ
offline
Опыт: 44,079
Активность:
а ты сначала объяви локалку, а потом присваивай её значение:
Код:
local rect rct
if ...
    set rct = КусеИнСутеук()
endif
Старый 12.01.2009, 23:26
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Ура)))))) разобрался!) Работает для всех игроков и зомбаки создаются как надо...)

Увеличил время между периодами спавна на 1 секунду... ну это уже дело баланса:), так как зомби терь будут всегда рядом спавниться....

Код:
Код удалён, не рабочий :):


Ток один вопрос....а юниты эти случаем не будут спавниться за пределами карты? Если игрок будет около предела.... это же вроде крэш вызывает

А впрочем щас сам проверю


Крэш стабильно

Отредактировано Ranger21, 13.01.2009 в 08:59.
Старый 13.01.2009, 00:20
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Надо делать проверку чтоли.... чтобы юниты не создавались за картой?

А когда кусок региона создаётся за картой... это можно?

Что-то я не правильно написал.... начинает стабильно зависать уже при запуске триггера :), если игрок 1 играет....

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

А при первом игроке вообще стабильно повисает(((((

Как луп написать...чтобы он не вис для всех игроков?=(

Вот код мой. PS: num = 6

Код:
function Trig_SpawnGhoul_Conditions takes nothing returns boolean
    return CountLivingPlayerUnitsOfTypeId('u001', Player(11)) < 100
endfunction

function Trig_SpawnGhoul_Func005001 takes nothing returns boolean
    return CountUnitsInGroup(GetUnitsOfTypeIdAll('u000')) <= 12
endfunction

function RectByCenter takes unit u, real width, real height returns rect
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    return Rect(x-width*0.5,y-height*0.5,x+width*0.5,y+height*0.5)
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
    local rect rct = null
    local real x = 0
    local real y = 0
    local integer i=0
    local integer r=0
loop
    exitwhen r>=udg_num
    if udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[r])))]!=null then
    set rct = RectByCenter(udg_Marine[(GetPlayerId(GetOwningPlayer(udg_Marine[r])))], 4000, 4000)
    set x = GetRandomReal(GetRectMinX(rct),GetRectMaxX(rct))
    set y = GetRandomReal(GetRectMinY(rct),GetRectMaxY(rct))
    
    loop
    set i=i+1
    call CreateUnit(Player(11),'u001',x,y,270.)
    exitwhen i==4
    endloop
    
    endif
    set r=r+1
    call RemoveRect(rct)
    set rct=null
endloop
    

    if Trig_SpawnGhoul_Func005001() then
        set x = GetRandomReal(GetRectMinX(gg_rct_ZombieSpaw3),GetRectMaxX(gg_rct_ZombieSpaw3))
        set y = GetRandomReal(GetRectMinY(gg_rct_ZombieSpaw3),GetRectMaxY(gg_rct_ZombieSpaw3))
        call CreateUnit(Player(11),'u000',x,y,270.)
    endif
    
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call DisableTrigger( gg_trg_SpawnGhoul )
    call TriggerRegisterTimerEventPeriodic( gg_trg_SpawnGhoul, 2.00 )
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction


Ranger21 добавил:
Кто поможет ? xD

Отредактировано Ranger21, 13.01.2009 в 09:00.
Старый 13.01.2009, 09:28
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
» код
Код:
function Trig_SpawnGhoul_Conditions takes nothing returns boolean
    return CountLivingPlayerUnitsOfTypeId('u001', Player(11)) < 100
endfunction

function SetRectByCenter takes rect r, unit u, real width, real height returns rect
    return SetRect(r,GetUnitX(u)-width*0.5,GetUnitY(u)-height*0.5,GetUnitX(u)+width*0.5,GetUnitY(u)+height*0.5)
endfunction

function Trig_SpawnGhoul_Actions takes nothing returns nothing
    local rect rct = Rect(0,0,0,0)
    local real x = 0
    local real y = 0
    local integer i = 0
    local integer r = 0
    
    loop
        exitwhen r>=udg_num
        if udg_Marine[r]!=null then
            call SetRectByCenter(rct, udg_Marine[r], 4000, 4000)
            set x = GetRandomReal(GetRectMinX(rct),GetRectMaxX(rct))
            set y = GetRandomReal(GetRectMinY(rct),GetRectMaxY(rct))
            
            set i = 0
            loop
                set i = i + 1
                call CreateUnit(Player(11),'u001',x,y,270.)
                exitwhen i>=4
            endloop
            
        endif

        set r = r + 1
    endloop
    

    if CountUnitsInGroup(GetUnitsOfTypeIdAll('u000')) <= 12 then
        set x = GetRandomReal(GetRectMinX(gg_rct_ZombieSpaw3),GetRectMaxX(gg_rct_ZombieSpaw3))
        set y = GetRandomReal(GetRectMinY(gg_rct_ZombieSpaw3),GetRectMaxY(gg_rct_ZombieSpaw3))
        call CreateUnit(Player(11),'u000',x,y,270.)
    endif
    
    call RemoveRect(rct)
endfunction

//===========================================================================
function InitTrig_SpawnGhoul takes nothing returns nothing
    set gg_trg_SpawnGhoul = CreateTrigger(  )
    call DisableTrigger( gg_trg_SpawnGhoul )
    call TriggerRegisterTimerEvent( gg_trg_SpawnGhoul, 2.00, true )
    call TriggerAddCondition( gg_trg_SpawnGhoul, Condition( function Trig_SpawnGhoul_Conditions ) )
    call TriggerAddAction( gg_trg_SpawnGhoul, function Trig_SpawnGhoul_Actions )
endfunction

Немного почистил, должно работать. От CountUnitsInGroup() и иже с ним попробуй избавиться сам )

Van Damm добавил:
Кстати, хорошо было бы заиметь сворачиваемые области для кода, как на wc3c =)
Старый 13.01.2009, 10:53
Ответ

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

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

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

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



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