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

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

Ответ
 
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
Утечки в систему CustomHPBars
Сразу скажу что подчищение переменных передаваемых в функции я добавил исключительно из отчаяния, когда пытался понять, что же так нагружает систему.
Суть системы:
• Отображение нестандартных ХП\МП баров
• Отображение на героях "спецэффекта" хила и получения урона на хп баре
  • При получении урона на HPBar'e та часть здоровья, что отнята полученным уроном подсвечивается красным в течении 0.6 секунд с постепенным затуханием в черный.
  • При хиле героя на HPBar'e та часть здоровья, что была восстановлена подсвечивается желтым.
• "Классический" переход цвета в зависимости от здоровья (100% = зеленый, 0% = красный)
• HPBar отображается только на тех вражеских юнитах которые в данный момент получают урон.
  • Если вражеский юнит получил урон и его здоровье стало ниже 40% (юнит готов к денаингу) - его здоровье HPBar будет виден всем игрокам, до того момента пока юнит либо умрет, либо его здоровье будет восстановлено выше 40%
• HP\MPBar'ы отображаются на союзных героях перманентно, на вражеских героях - в течении 1-3 секунд с момента получения атаки
• Юниты обладают HPBar'ом в виде кубика, постепенно меняющего цвет (герои имеют полоску)
Итак, суть и функционал системы я описал, теперь осталось описать реализацию, для того что бы тем, кто решит помочь было несколько проще читать код.
Для каждого игрока создается по 2 группы, привязанные к номеру игрока, первая группа содержит в себе всех юнитов, для которых требуется отображать HPBar для игрока, вторая группа нужна для груплупа в функции GroupBar.
Количество таймеров равно количеству игроков под контролем пользователя, таково же количество групп.
Для каждого юнита, при занесении его в группу Х (воизбежание спама хэндлов) создаются два тексттага, в которых будут отображаться полоски здоровья и маны юнита, пока юнит находится в группе.
Тоесть для каждого игрока - свои тексттаги.
Хэндлтаймер выдает стабильное количество хэндлов в течении теста, однако вес процесса увеличивается с 80МБ до 100МБ спустя всего один "замес".
» API
((код jass
function R2RI takes real r returns integer
local real f=r
loop
exitwhen f<1.0
set f=f-1.0
endloop
if f > 0.5 then
return R2I(r+1)
else
return R2I(r)
endif
endfunction
function D2H takes integer i returns string
local string abc = "0123456789abcdef"
local string s = SubString(abc, i / 16, i / 16 + 1) + SubString(abc, ModuloInteger(i, 16), ModuloInteger(i, 16) + 1)
return s
endfunction
function RGB takes real red, real green, real blue returns string
local string R = D2H(PercentToInt(red,255))
local string G = D2H(PercentToInt(green,255))
local string B = D2H(PercentToInt(blue,255))
return "|c00"+R+G+B
endfunction
function DamageTooks takes unit u, real dmg returns nothing
local integer ui=GetHandleId(u)
call SaveReal(udg_Bars,ui,4,dmg+LoadReal(udg_Bars,ui,4))
call SaveReal(udg_Bars,ui,5,(100+LoadReal(udg_Bars,ui,5))/2)
call SaveReal(udg_Bars,ui,6,GetWidgetLife(u))
endfunction
function TakeHPBar takes unit u returns string
local real curlife=GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)
local real PercCount=GetUnitState(u,UNIT_STATE_MAX_LIFE)/100
local integer ui = GetHandleId(u)
local real damagetaken=LoadReal(udg_Bars,ui,4)/PercCount
local real fade =LoadReal(udg_Bars,ui,5)
local string s
local real array count
local integer perc =R2RI(curlife)
local boolean b = damagetaken<0
if b then
set curlife = curlife+damagetaken
set damagetaken = damagetaken*(0-1)
endif
set count[1] = I2R(R2RI(curlife))/2.5
if b==false then
set count[2] = I2R(R2RI(100-curlife-damagetaken))/2.5
else
set count[2] = I2R(R2RI(100-I2R(perc)))/2.5
endif
set count[4] = I2R(R2I(damagetaken))/2.5
set count[3] = 0
set s = RGB(100-curlife,curlife,0)
if IsUnitType(u,UNIT_TYPE_HERO) then
loop
exitwhen count[3] > count[1]-1
set s = s+"("
set count[3]=count[3]+1
endloop
if b then
set count[5] =fade*0.01*curlife
set s = s+RGB(100-count[5],100-count[5],0)
else
set s = s+RGB(fade,0,0)
endif
set count[3]=0
loop
exitwhen count[3] > count[4]-1
set s = s+"("
set count[3]=count[3]+1
endloop
set s = s+"|c00000015"
set count[3]=0
loop
exitwhen count[3] > count[2]-1
set s = s+"("
set count[3]=count[3]+1
endloop
if fade>0 then
call SaveReal(udg_Bars,ui,5,fade-5)
else
call SaveReal(udg_Bars,ui,4,0)
call SaveReal(udg_Bars,ui,5,0)
endif
else
set s=s+"•"
endif
return s
endfunction
function TakeMPBar takes unit u returns string
local real lifeperc=GetUnitStatePercent(u,UNIT_STATE_MANA,UNIT_STATE_MAX_MANA)
local integer pew = R2RI(lifeperc)/100*255
local string s
local real array count
local integer perc =R2RI(lifeperc)
set s = RGB(0,50-(100-lifeperc)/2,100-(100-lifeperc)/2)
set count[1] = I2R(perc)/2.5
number of dots in coloredpart
set count[2] = I2R(100-perc)/2.5
number of dots in emptypart
set count[3] = 1
if IsUnitType(u,UNIT_TYPE_HERO) then
loop
exitwhen count[3] > count[1]
set s = s+"("
set count[3]=count[3]+1
endloop
set s = s+"|c00000015"
set count[3]=1
loop
exitwhen count[3] > count[2]
set s = s+"("
set count[3]=count[3]+1
endloop
else
set s=s+"•"
endif
set u=null
return s
endfunction
function AddBarsTxttg takes boolean b returns texttag
local texttag t = CreateTextTag()
call SetTextTagPos(t,0,0,0)
call SetTextTagText(t,"" , TextTagSize2Height(0))
call SetTextTagColorBJ(t, 100., 100., 100., 0.)
call ShowTextTagForceBJ( false, t, bj_FORCE_ALL_PLAYERS )
call SetTextTagPermanent( t, b )
return t
endfunction
function ModBar takes texttag t,unit u,string s, player p, real x,boolean hero returns nothing
if hero then
call SetTextTagText(t,s,0.0069)
call SetTextTagPos(t,GetWidgetX(u) + 40 * Cos(180 * bj_DEGTORAD),GetWidgetY(u) + 40 * Sin(180 * bj_DEGTORAD), x)
else
call SetTextTagText(t,s,0.0299)
call SetTextTagPos(t,GetWidgetX(u) + 7 * Cos(180 * bj_DEGTORAD),GetWidgetY(u) + 7 * Sin(180 * bj_DEGTORAD), GetUnitFlyHeight(u)+x)
endif
call ShowTextTagForceBJ(false,t,bj_FORCE_ALL_PLAYERS)
if IsUnitVisible(u,p) then
call ShowTextTagForceBJ(true,t, bj_FORCE_PLAYER[GetPlayerId(p)])
endif
set u =null
set p=null
endfunction
function FadeTT takes texttag t,texttag t2, real x returns nothing
if x < 1.0 then
call SetTextTagColorBJ(t,100,100,100,100-x*100)
call SetTextTagColorBJ(t2,100,100,100,100-x*100)
else
call SetTextTagColorBJ(t,100,100,100,0)
call SetTextTagColorBJ(t2,100,100,100,0)
endif
endfunction
function SetTTState takes unit u, texttag t,player p, boolean hero, unitstate state returns nothing
if GetWidgetLife(u) > 0 then
if state==UNIT_STATE_LIFE then
call ModBar(t,u,TakeHPBar(u),p,140,hero)
elseif state==UNIT_STATE_MANA then
if GetUnitState(u,UNIT_STATE_MAX_MANA)>0 then
if hero == false then
call ModBar(t,u,TakeMPBar(u),p,126,hero)
else
call ModBar(t,u,TakeMPBar(u),p,133,hero)
endif
else
call SetTextTagColorBJ(t,100,100,100,100)
endif
endif
else
call SetTextTagColorBJ(t,0,0,0,100)
endif
set u=null
set p=null
endfunction
function AppearBar takes unit u, player p, group g returns nothing
local integer ui = GetHandleId(u)
local boolean permanent = LoadBoolean(udg_Bars,ui,10+GetPlayerId(p))
local real time = LoadReal(udg_Bars,ui,1)
local texttag hpbar =LoadTextTagHandle(udg_Bars,ui,2)
local texttag mpbar =LoadTextTagHandle(udg_Bars,ui,3)
local real lastlife =LoadReal(udg_Bars,ui,6)
local real wl = GetWidgetLife(u)
local boolean hero = IsUnitType(u,UNIT_TYPE_HERO)
if lastlife < wl-20 then
call DamageTooks(u,0-(wl-lastlife))
call SaveReal(udg_Bars,ui,6,wl)
endif
call SetTTState(u,hpbar,p,hero,UNIT_STATE_LIFE)
call SetTTState(u,mpbar,p,hero,UNIT_STATE_MANA)
if permanent == false then
call FadeTT(hpbar,mpbar,time)
set time=time-0.03
call SaveReal(udg_Bars,ui,1,time)
endif
if time < 0 or wl<=0 then
if permanent and hero==false and GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)>40 then
call SaveBoolean(udg_Bars,ui,10+GetPlayerId(p),false)
endif
if permanent==false then
call SetTextTagLifespan(hpbar,0.0)
call SetTextTagFadepoint(hpbar,0.0)
call SetTextTagLifespan(mpbar,0.0)
call SetTextTagFadepoint(mpbar,0.0)
call GroupRemoveUnit(g,u)
call FlushChildHashtable(udg_Bars,ui)
else
if hero==false then
call SetTextTagLifespan(hpbar,0.0)
call SetTextTagFadepoint(hpbar,0.0)
call SetTextTagLifespan(mpbar,0.0)
call SetTextTagFadepoint(mpbar,0.0)
call GroupRemoveUnit(g,u)
call FlushChildHashtable(udg_Bars,ui)
endif
endif
endif
set hpbar=null
set mpbar=null
set u=null
set p=null
set g=null
endfunction
function GroupBar takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer ti=GetHandleId(t)
local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0)))
local group g=LoadGroupHandle(udg_Bars,0,pid)
local unit v =null
local group x=LoadGroupHandle(udg_Bars,0,30+pid)
call GroupAddGroup(g,x)
loop
exitwhen CountUnitsInGroup(x) == 0
set v = FirstOfGroup(x)
call AppearBar(v,Player(pid),g)
call GroupRemoveUnit(x,v)
set v =null
endloop
call GroupClear(x)
set g=null
set x=null
set v=null
set t=null
endfunction
function ShowBar takes unit u, player p, boolean permanent returns nothing
local timer t=CreateTimer()
local integer ti=GetHandleId(t)
local integer pid=GetPlayerId(p)
local integer hi =GetHandleId(u)
local group g = LoadGroupHandle(udg_Bars,0,pid)
local boolean b = IsUnitInGroup(u,g)
if GetPlayerController(p)==MAP_CONTROL_USER then
if b then
call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40))
else
call SaveTextTagHandle(udg_Bars,hi,2,AddBarsTxttg(permanent))
call SaveTextTagHandle(udg_Bars,hi,3,AddBarsTxttg(permanent))
call SaveBoolean(udg_Bars,hi,10+pid,permanent)
call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40))
call SaveReal(udg_Bars,hi,4,0)
call SaveReal(udg_Bars,hi,5,0)
call SaveReal(udg_Bars,hi,6,GetWidgetLife(u))
call GroupAddUnit(g,u)
endif
endif
set g=null
set t=null
set u=null
set p=null
endfunction
function ShowBarToAll takes unit u returns nothing
local integer i=0
loop
exitwhen i > 15
if GetPlayerController(Player(i))==MAP_CONTROL_USER then
call ShowBar(u,Player(i),true)
endif
set i=i+1
endloop
set u=null
endfunction
))
прошу помочь устранить загрязнение памяти и сделать систему "легче", желательно еще и объяснив что и где не так.
P.S казалось бы - вроде уже не совсем то и нуб, но тут мои полномочия все.

Отредактировано ShadoW DaemoN, 16.05.2011 в 18:55.
Старый 16.05.2011, 18:37
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
не увидел где создаётся группа, и ещё про группы игроков (force)
мб они вызывают лаги
так всё чисто
Старый 16.05.2011, 18:56
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
16GB, так вот в том то и фишка что утечек нет, фиксированное количество утечных хэндлов
нашел баг - для каждого юнита создаются и\или перезаписываются тексттаги, поправил, однако тормозить меньше не стало.
FKoFF добавил:
» Triggers
((код jass
function f1 takes nothing returns nothing
local player p=GetOwningPlayer(GetEventDamageSource())
local unit u=GetTriggerUnit()
local player p1=GetOwningPlayer(u)
call ShowBar(u,p,false)
call ShowBar(u,p1,false)
call DamageTooks(u,GetEventDamage())
set p=null
set u=null
set p1=null
endfunction
===========================================================================
function InitTrig_f1 takes nothing returns nothing
set gg_trg_f1 = CreateTrigger( )
call TriggerAddAction( gg_trg_f1, function f1)
endfunction
))
((код jass
function Pew takes nothing returns nothing
local group g=LoadGroupHandle(udg_Bars,0,21)
local unit u =GetEnumUnit()
if IsUnitInGroup(u,g)==false then
if IsUnitType(u,UNIT_TYPE_HERO) then
call ShowBar(u,GetOwningPlayer(u),true)
endif
call GroupAddUnit(g,u)
call TriggerRegisterUnitEvent(gg_trg_f1,u,EVENT_UNIT_DAMAGED)
endif
set g=null
set u=null
endfunction
function Trig_f_Actions takes nothing returns nothing
local group g =LoadGroupHandle(udg_Bars,0,20)
local integer l1 = 0
local integer l2 = 1
call GroupEnumUnitsInRect(g,GetWorldBounds(),null)
call ForGroup(g,function Pew)
call GroupClear(g)
set g=null
endfunction
===========================================================================
function InitTrig_f takes nothing returns nothing
set gg_trg_f = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_f, 1.00 )
call TriggerAddAction( gg_trg_f, function Trig_f_Actions )
endfunction
))
((код jass
function PrepareBar takes player p returns nothing
local timer t=CreateTimer()
call SaveInteger(udg_Bars,GetHandleId(t),0,GetPlayerId(p))
call TimerStart(t,0.03,true,function GroupBar)
set t=null
endfunction
function Trig_Selected_Actions takes nothing returns nothing
local integer i =0
local player p
set udg_Bars=InitHashtable()
loop
exitwhen i>15
set p =Player(i)
if GetPlayerController(p)==MAP_CONTROL_USER then
call PrepareBar(p)
call SaveGroupHandle(udg_Bars,0,i,CreateGroup())
call SaveGroupHandle(udg_Bars,0,30+i,CreateGroup())
endif
set i=i+1
endloop
call SaveGroupHandle(udg_Bars,0,20,CreateGroup())
call SaveGroupHandle(udg_Bars,0,21,CreateGroup())
call EnablePreSelect( false, false )
endfunction
===========================================================================
function InitTrig_Selected takes nothing returns nothing
set gg_trg_Selected = CreateTrigger( )
call TriggerRegisterTimerEventSingle( gg_trg_Selected, 0.1 )
call TriggerAddAction( gg_trg_Selected, function Trig_Selected_Actions )
endfunction
))
Старый 16.05.2011, 19:13
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
мб вот это не удаляешь рект
native GetWorldBounds           takes nothing returns rect
Старый 16.05.2011, 19:23
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
16GB, пофиксил, лаги в момент схватки не пропали (когда для большого количества юнитов отображаются ХПбары)
Старый 16.05.2011, 19:29
ShadoW DaemoN

offline
Опыт: 37,078
Активность:

0. Просто...

Потратил на данное сообщение около часа. Just in case.

1. Начало!

Используйте Script Language Aligner, когда выкладываете код на форум - читать удобнее. Уже пофиксил первое сообщение.
К тому же, вам самому разве не удобно читать хорошо оформленный и выровненный код?

2. Что это такое?

((кат за раз по чайной ложке
((код jass
function R2RI takes real r returns integer
local real f=r
loop
exitwhen f<1.0
set f=f-1.0
endloop
if f > 0.5 then
return R2I(r+1)
else
return R2I(r)
endif
endfunction
))
))
А если в качестве аргумента передадут большое значение? Будет превышен лимит операций и игра "насильно высунет функцию из памяти". Правильней будет так:
((код jass
function R2RI takes real r returns integer
if (r < 0.0) then
return R2I(r - 0.5)
endif
return R2I(r + 0.5)
endfunction
))
Хотя я не думаю, что в эту функцию в данной системе передаются отрицательные значения, поэтому достаточно будет так:
((код jass
function R2RI takes real r returns integer
return R2I(r + 0.5)
endfunction
))

3. Чудеса радуги!

((кат трюкачество со стрингами
((код jass
function D2H takes integer i returns string
local string abc = "0123456789abcdef"
local string s = SubString(abc, i / 16, i / 16 + 1) + SubString(abc, ModuloInteger(i, 16), ModuloInteger(i, 16) + 1)
return s
endfunction
function RGB takes real red, real green, real blue returns string
local string R = D2H(PercentToInt(red,255))
local string G = D2H(PercentToInt(green,255))
local string B = D2H(PercentToInt(blue,255))
return "|c00"+R+G+B
endfunction
))
))
Медленно. Быстрее будет использовать уже готовые значения, то есть заполнить ОДИН массив (а не три с одинаковым содержимым, как сделали бы многие трюкачи, услышав похожий совет) и использовать типа так:
((код jass
set Hex[0] = "00"
...
set Hex[255] = "FF"
function RGB takes real red, real green, real blue returns string
return "|c00"+Hex[R2I(red*2.55)]+Hex[R2I(green*2.55)]+Hex[R2I(blue*2.55)]
endfunction
))
Лучше было бы вести расчёты процентов не в диапазоне 1..100, а 0..255. Тогда:
((код jass
function RGB takes real red, real green, real blue returns string
return "|c00"+Hex[R2I(red)]+Hex[R2I(green)]+Hex[R2I(blue)]
endfunction
))

4. Двойная проверка?

Ведь найдётся такой трюкач, который выйдет из игры в аккурат между двумя проверками.
((кат двойной if-then - двойная польза
((код jass
function ShowBar takes unit u, player p, boolean permanent returns nothing
. . .
if GetPlayerController(p)==MAP_CONTROL_USER then
. . .
endfunction
function ShowBarToAll takes unit u returns nothing
local integer i=0
loop
exitwhen i > 15
if GetPlayerController(Player(i))==MAP_CONTROL_USER then
call ShowBar(u,Player(i),true)
endif
set i=i+1
endloop
set u=null
endfunction
))
))
К тому же, проверка на управление игроком встречается не только здесь. Вероятней всего, лучше будет вынести это отдельно, дабы не проверять лишний раз. Однако, я думаю, что следует сделать проверку на присутствие игрока в игре (и не в каждой функции, как вы понимаете).

5. Внимание, большое бревно на рельсах!

((кат бревно
((код jass
function GroupBar takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer ti=GetHandleId(t)
local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0)))
local group g=LoadGroupHandle(udg_Bars,0,pid)
local unit v =null
local group x=LoadGroupHandle(udg_Bars,0,30+pid)
call GroupAddGroup(g,x)
loop
exitwhen CountUnitsInGroup(x) == 0
set v = FirstOfGroup(x)
call AppearBar(v,Player(pid),g)
call GroupRemoveUnit(x,v)
set v =null
endloop
call GroupClear(x)
set g=null
set x=null
set v=null
set t=null
endfunction
function PrepareBar takes player p returns nothing
local timer t=CreateTimer()
call SaveInteger(udg_Bars,GetHandleId(t),0,GetPlayerId(p))
call TimerStart(t,0.03,true,function GroupBar)
set t=null
endfunction
))
))
Здесь прекрасно показана ситуация, когда отец, чтобы забрать ребёнка из садика, приводит домой всех детей и каждого проверяет. Используйте ForGroup()!
Кроме того, здесь присутствует отличный пример индусского кода, господа:
((код jass
local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0)))
))

6. BJ-функции?

((код jass
GetUnitStatePercent(...)
SetTextTagColorBJ(...)
и ещё некоторые функции для текст-тагов
))
Я думаю, не нужно объяснять, что с ними нужно сделать.

7. Насчёт читабельности кода!

((кат всё просто
((код jass
set count[1] = I2R(R2RI(curlife))/2.5
if b==false then
set count[2] = I2R(R2RI(100-curlife-damagetaken))/2.5
else
set count[2] = I2R(R2RI(100-I2R(perc)))/2.5
endif
set count[4] = I2R(R2I(damagetaken))/2.5
set count[3] = 0
))
))
Непонятно же. Если предпочитаешь использовать массивы, хотя бы напиши комментарий, какое значение хранится в каждой ячейке. Далее...
((кат адик негодует
((код jass
call SaveTextTagHandle(udg_Bars,hi,2,AddBarsTxttg(permanent))
call SaveTextTagHandle(udg_Bars,hi,3,AddBarsTxttg(permanent))
call SaveBoolean(udg_Bars,hi,10+pid,permanent)
call SaveReal(udg_Bars,hi,1,1.0+(2.5-GetUnitStatePercent(u,UNIT_STATE_LIFE,UNIT_STATE_MAX_LIFE)/40))
call SaveReal(udg_Bars,hi,4,0)
call SaveReal(udg_Bars,hi,5,0)
call SaveReal(udg_Bars,hi,6,GetWidgetLife(u))
))
))
2, 3, 10+pid, 4, 5, 6 - это что? Ключи совершенно не отражают сути содержимого ячеек в хэше.

8. Это выглядит как-то расточительно?

((кат и немного жирно
((код jass
function Trig_f_Actions takes nothing returns nothing
local group g =LoadGroupHandle(udg_Bars,0,20)
local integer l1 = 0
local integer l2 = 1
call GroupEnumUnitsInRect(g,GetWorldBounds(),null)
call ForGroup(g,function Pew)
call GroupClear(g)
set g=null
endfunction
function InitTrig_f takes nothing returns nothing
set gg_trg_f = CreateTrigger( )
call TriggerRegisterTimerEventPeriodic( gg_trg_f, 1.00 )
call TriggerAddAction( gg_trg_f, function Trig_f_Actions )
endfunction
))
))
Некорректное добавление/удаление юнитов из обработки. Необходимо использовать события на вход и выход юнита из региона.

9. Это ещё не конец!

В целом по коду - плохо. Совсем же недавно статья была, Распространённые ошибки Jass программистов, которая ко всему прочему ПРИКРЕПЛЕНА. Также советую почитать теоретическую информацию в Jass-библиотеке
Старый 16.05.2011, 20:38
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
ShadoW_DaemoN:
  1. Внимание, большое бревно на рельсах!
неувязочка - там выбираются все юниты из группы g, просто удалять их из группы g не резон, для этого и есть группа x которая служит для лупа (что бы не выносить в ForGroup()) который, мало того что отдельная функция так и передача туда нужных данных (игрок, группа х) является теми еще танцами с бубном. По крайней мере функции GetCurrentGroup() я не нашел, правда, а перебирать все 2*bj_ALL_PLAYERS_FORCE группы я считаю не более рациональным действием.
Старый 17.05.2011, 02:16
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Конкретней про этот отрезок кода:
  • Для каждого игрока создаётся отдельный таймер.
  • В цикле очень нехорошее условие
((код jass
exitwhen CountUnitsInGroup(x) == 0
))
которое будет просчитываться с частотой 33*N раза в секунду (33 = 1/0.03, N - кол-во юнитов в группе). Те, кто используют цикл, обычно пишут так:
((код jass
loop
set v = FirstOfGroup(x)
exitwhen v == null
call GroupRemoveUnit(x, v)
действия
endloop
))
Зачем вы использовали CountUnitsInGroup(...) - неясно.
  • Кроме того, я не понимаю, зачем вы используете цикл по группе, если у него только одно преимущество - не нужно переносить параметры в обработчик цикла.
  • Если делать минимальную оптимизацию (без единого таймера для всех игроков), то код функции GroupBar укладывается в 3 строчки, и коллбек - ещё одна строчка. Я уверен, что и остальные функции можно сократить и улучшить.
Старый 17.05.2011, 09:07
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
local integer pid=GetPlayerId(Player(LoadInteger(udg_Bars,ti,0)))
долго перло:)
Ето перестраховка. (дос)

Отредактировано Doc, 17.05.2011 в 11:57.
Старый 17.05.2011, 11:15
FKoFF
Venomancer 89lvl. Europe
offline
Опыт: 5,975
Активность:
ShadoW_DaemoN:
Если делать минимальную оптимизацию (без единого таймера для всех игроков), то код функции GroupBar укладывается в 3 строчки, и коллбек - ещё одна строчка. Я уверен, что и остальные функции можно сократить и улучшить.
хм? вместо таймеров переодический триггер? Ну, вы бы могли мне помочь и доработать этот кубик рубик.
Старый 17.05.2011, 18:44
DotaMaster666
Silenced by GadenbIsh
offline
Опыт: 1,259
Активность:
А можно выложить не код, а карту с рабочей системой? И что бы там демо было, как оно да что должно работать.
Старый 18.05.2011, 10:28
Ответ

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

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

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

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



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