8

» WarCraft 3 / Оптимизация кода на создание юнитов для МОБА игры

ScopteRectuS:
Слишком много ненужных действии и скорее всего код у тебя не работает. Вот, коротко и ясно:
function Trig_CreepsCenter1_Actions takes nothing returns nothing
    call IssuePointOrder( CreateUnit( Player( 0 ), 'o000', 0.0, 5300.0, 0.0 ), "attack", 0.0, -5300.0 )
    call IssuePointOrder( CreateUnit( Player( 0 ), 'o001', 0.0, 5300.0, 0.0 ), "attack", 0.0, -5300.0 )
  
    call IssuePointOrder( CreateUnit( Player( 1 ), 'h000', -5300.0, 0.0, 0.0 ), "attack", 5300.0, 0.0 )
    call IssuePointOrder( CreateUnit( Player( 1 ), 'h001', -5300.0, 0.0, 0.0 ), "attack", 5300.0, 0.0 )
    
    call IssuePointOrder( CreateUnit( Player( 3 ), 'n000', 0.0, -5300.0, 0.0 ), "attack", 0.0, 5300.0 )
    call IssuePointOrder( CreateUnit( Player( 3 ), 'n001', 0.0, -5300.0, 0.0 ), "attack", 0.0, 5300.0 )
    
    call IssuePointOrder( CreateUnit( Player( 6 ), 'u000', 5300.0, 0.0, 0.0 ), "attack", -5300.0, 0.0 )
    call IssuePointOrder( CreateUnit( Player( 6 ), 'u001', 5300.0, 0.0, 0.0 ), "attack", -5300.0, 0.0 )
endfunction  



//===========================================================================
function InitTrig_CreepsCenter1 takes nothing returns nothing
    call TimerStart( CreateTimer( ), 1.00, true, function Trig_CreepsCenter1_Actions )
endfunction
Не, мой код работает как бы нормально, только с оптимизацией вопросы. А вот твой я щаз попробовал и он не работает) ща попробую разобраться почему
8

» WarCraft 3 / Переделалка триггера для создания крипов приверно как в доте.

quq_CCCP:
VVelikolepniy, я хз как сказать, но по мне дурь. Дело не только в утечках а в подходе в целом. Куча мусора и ненужных действий.
То есть ты гоовришь что код дурь, но сам понятия не имеешь как сделать лучше, я правильно все понял?
Extremator:
. . . а ещё, можно не использовать точки
. . . а ещё, сначала нужно удалять точки ссылаясь на переменные, а только потом обнулять ссылки этих переменных, а не наоборот
set detloc1 = null
set insploc1 = null
set absorbloc1 = null
set destrloc1 = null
call RemoveLocation(detloc1)
call RemoveLocation(insploc1)
call RemoveLocation(absorbloc1)
call RemoveLocation(destrloc1)
. . . а ещё это касается и групп
set destr1 = null
call DestroyGroup (destr1)
а вот это полезно, спасибо!
ledoed:
супер у тебя код,они просто непонимают
почему тебе до сих пор бан не дали детка? я вроде отправил сообщение
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

nvc123:
ClotPh, в карте есть незначительные утечки внутри бж функций
правда они настолько не значительны что не влияют ни на что
VVelikolepniy, функция Location создаёт точку
если точка была создана то её надо удалить
чего ты не делаешь
лучше не использовать точки а напрямую работать с координатами
а юнитов создавать циклом
так и группы удалять не придётся
и да
все локальные переменные после удаления объекта надо очищать
вот пример цикла
int i=0;
int countUnits=5; // количество юнитов
loop{
	exitwhen i == countUnits
	i++;
	// тут делай создание юнита и прочие действия
}
Я просто хотел, что бы создавался именно ОТРЯД, что бы юниты шли строем, типа что бы мечники впереди, а целители сзади
8

» WarCraft 3 / Триггер для выявления утечек

LordDracula:
этот способ работает только на версии варика ниже 1.24 т.к. использует RB
вставь себе в карту этот код
library handlecounter initializer InitTrig_HandleCounter
private timer Timer = CreateTimer()
private leaderboard HandleBoard

function HandleCounter_Update takes nothing returns nothing
   local integer i = 0
   local integer id
   local location array P
   local real result=0
   loop
      exitwhen i >= 50
      set i = i + 1
      set P[i] = Location(0,0)
      set id = GetHandleId(P[i])
      set result = result + (id-0x100000)
   endloop
   set result = result/i-i/2
   loop
      call RemoveLocation(P[i])
      set P[i] = null
      exitwhen i <= 1
      set i = i - 1
   endloop
   call LeaderboardSetItemValue(HandleBoard,0,R2I(result))
endfunction

function HandleCounter_Actions takes nothing returns nothing
   set HandleBoard = CreateLeaderboard()
   call LeaderboardSetLabel(HandleBoard, "Счетчик")
   call PlayerSetLeaderboard(GetLocalPlayer(),HandleBoard)
   call LeaderboardDisplay(HandleBoard,true)
   call LeaderboardAddItem(HandleBoard,"Хэндлы",0,Player(0))
   call LeaderboardSetSizeByItemCount(HandleBoard,1)
   call HandleCounter_Update()
   call TimerStart(GetExpiredTimer(),0.05,true,function HandleCounter_Update)
endfunction

function InitTrig_HandleCounter takes nothing returns nothing
   call TimerStart(Timer,0,false,function HandleCounter_Actions)
endfunction

endlibrary
для него нужен редактор JNGP xgm.guru/p/wc3/jassnewgenpack-r
Сори за тупость но зачем этот редактор JNGP нужен для кода? У меня офф варик просто, он обновился недавно, а этот дерактор НЕ РАБОТАЕТ с новой версией как там написано на его сайте.
А так я пользуюсь программой JassCraft
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

ClotPh:
У тебя создаются точки
как без точек - тебе Maniac_91 написал
Но у него в способе тоже координаты есть, разве там точки не создаются?
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

ClotPh:
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
Да, найти систему без утечек я должен мочь.. но не могу(
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

LordDracula:
VVelikolepniy:
RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
Да. Но лучше запиши эти данные в глобальную переменную, это, вроде, оптимальнее, чем создавать каждый раз лок. переменные.
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
Отчисти группу после использования call GroupClear(group). Возможно это поможет.
Кстати по такой же логике можно создать отряды по инициализации карты в глобальные переменные и вызывать в триггере их каждый раз)
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

Msey:
VVelikolepniy, Да, нужно использовать RemoveLocation(твоя локация)
А также
call DestroyGroup (destr1)
set destr1 = null
RemoveLocation(твоя локация) но я же не присваивал переменную к локации, у меня там координаты сразу. Можно ли написать RemoveLocation(5300.00, 0.00), или мне нужно в начале триггера присваивать локальную переменную координатам, а потом вызывать на место локальной переменной, а потом писать RemoveLocation(МОЯ ЛОКАЛЬНАЯ ПЕРЕМЕННАЯ). так?
А и еще вопрос Я где то читал что юниты из отряда тоже остаются как переменные после смерти, это правда? Может тоже истить этих юнитов после смерти отдельным триггером?
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

quq_CCCP:
VVelikolepniy, меньше раз в 10.
Ваш код одна большая утечка...
Но он же просто назначает точку как цент области, заставляет двигаться юнита к этой точке и удаляет точку. А я Создаю отряд по координатам, заставляю бжать отряд а потом удаляю отряд из памяти. Вы имеее ввиду что нужно удалять из памяти назначенные точки тоже?
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

quq_CCCP:
Extrime candy war в помощь.
Открыл по твоему совету Канди вар, и вот что увидел. Разве здесь не больше утечек, чем у меня?
ClotPh:
точки утекают все по-моему
группы надо не только разрушать но и обнулять
и после беглого просмотра не полная уверенность что в группы вообще везде правильно юниты добавляются
ты возьми систему в которой знаешь что утечек нет и адаптируй под себя
уж найти такую систему должен мочь
Ну вот да, я пытаюсь найти сейчас, доту открываю но там такое месиво, пока ничего не понял)
Щаз еще посмотрю в функциях как ОБНУЛЯТЬ группы!
Загруженные файлы
8

» WarCraft 3 / Выявление утечек в коде имитации крипов в МОБА (как в Доте)

Maniac_91:
Эм.. А зачем использовать ""Location(0.00, 5300.00)" ? Можно же без точек. Примерно так:
call CreateUnit (Player(0), 'o000', 0, 5300, 0)
а как тебя забанить что бы ты у меня в темах не писал?
Но тут ledoed прав, утечек действительно много. Не буду я его за это банить
Вот сижу разбираюсь, но с функцией CreateNUnitsAtLoc получается вызывать несколько юнитов, а с функцией CreateUnit не получается. Я что то не так делаю или цикл нужен?
Maniac_91:
Эм.. А зачем использовать ""Location(0.00, 5300.00)" ? Можно же без точек. Примерно так:
call CreateUnit (Player(0), 'o000', 0, 5300, 0)
а как тебя забанить что бы ты у меня в темах не писал?
Но тут ledoed прав, утечек действительно много. Не буду я его за это банить
И кстати CreateNUnitsAtLoc я не нашел в том мануале, что ты скинул. Нашел эту функцию из конвертации обычного триггера
8

» WarCraft 3 / Оптичизация кода на Jass

Maniac_91:
VVelikolepniy:
А цикл вызова мобов разве не хуже, чем вызов отряда?
Это точно не знаю, но не помню, что где-то была функция создания группы юнитов по координатам
VVelikolepniy:
И координаты точки все равно потом зачищать нужно, как и область в конце триггера, разве нет?
Ну я ж говорю: координаты вместо точек. Тогда и точки и области не нужны.
Спасибо за помощь) Смотри я переделал по твоему совету с координатами! xgm.guru/p/100/206428
8

» WarCraft 3 / Оптичизация кода на Jass

Maniac_91:
Можно использовать координаты вместо точек.
Например, в цикле от 1 до 5
call CreateUnit (player id, integer unitid, real x, real y, real face)
И приказ отдавать по координатам.
call GroupPointOrder (group whichGroup, string order, real x, real y)
Ещё можно вместо центра регионов те же координаты на карте использовать.
Советую посмотреть вот это: JASS API. Там все функции расписаны.
А цикл вызова мобов разве не хуже, чем вызов отряда? И координаты точки все равно потом зачищать нужно, как и область в конце триггера, разве нет?