Сейчас 10:51:41 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Помогите оптимизировать код
demon_nrtДата: Четверг, 29 Августа 2013, 19:16:57 | Сообщение # 1
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Я знаю что он плохо написан, но это то что я могу. Я хочу попросить оптимизировать этот код. А то когда используешь способность карта подлагивает, а когда используешь часто, то лаги не проходят.
[code=jass]
function Trig_Krovavy_reka_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A04U' ) ) then
return false
endif
return true
endfunction
function Krovavy_reka takes nothing returns nothing
local timer Krt = GetExpiredTimer()
local integer h = GetHandleId(Krt)
local unit Kru = LoadUnitHandle(udg_Hash,h,1)
local unit Kru1 = LoadUnitHandle(udg_Hash,h,3)
local location Krp1 = GetUnitLoc (Kru1)
local real TargX
local real TargY
local real TargA
local real Fr
local location Krp = LoadLocationHandle(udg_Hash,h,2)
set TargX = GetUnitX(Kru1)
set TargY = GetUnitY(Kru1)
set Fr = GetUnitFacing(Kru1)
set TargA = Fr
set TargX = TargX + 50.00 * Cos(TargA * 0.0174532)
set TargY = TargY + 50.00 * Sin(TargA * 0.0174532)
call SetUnitPosition( Kru1, TargX, TargY)
if ( not ( R2I(DistanceBetweenPoints(Krp, Krp1)) >= 1200 ) ) then
else
call RemoveUnit( Kru1 )
call FlushChildHashtable(udg_Hash,h)
call PauseTimer (Krt)
call DestroyTimer (Krt)
set Krt = null
call RemoveLocation (Krp)
call RemoveLocation (Krp1)
set Krp = null
set Krp1 = null
set Kru = null
set Kru1 = null
set TargX = 0.00
set TargY = 0.00
set TargA = 0.00
set Fr = 0.00
endif
call RemoveLocation (Krp1)
set Krp1 = null
endfunction
function Krovavy_reka_Actions takes nothing returns nothing
local timer Krt = CreateTimer()
local integer h = GetHandleId(Krt)
local unit Kru = GetSpellAbilityUnit()
local integer Kri = 0
local integer Kri1 = 0
local location Krp = GetUnitLoc (Kru)
local unit Kru1
local real x=GetWidgetX(Kru)
local real y=GetWidgetY(Kru)
set Kru1 = CreateUnit( GetOwningPlayer (Kru), 'e00P',x,y,GetUnitFacing(Kru))
call SetUnitAbilityLevelSwapped( 'A04V',Kru1 , GetUnitAbilityLevelSwapped('A04U',Kru) )
call SaveUnitHandle(udg_Hash,h,1,Kru)
call SaveLocationHandle(udg_Hash,h,2,Krp)
call SaveUnitHandle(udg_Hash,h,3,Kru1)
call TimerStart(Krt,0.05,true, function Krovavy_reka )
call PolledWait (1)
set Kru1 = null
set Kru = null
call PolledWait (6)
call RemoveLocation (Krp)
call PauseTimer (Krt)
call DestroyTimer (Krt)
set Krt = null
call FlushChildHashtable(udg_Hash,h)
endfunction

//===========================================================================
function InitTrig_Krovavy_reka takes nothing returns nothing
set gg_trg_Krovavy_reka = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Krovavy_reka, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Krovavy_reka, Condition( function Trig_Krovavy_reka_Conditions ) )
call TriggerAddAction( gg_trg_Krovavy_reka, function Krovavy_reka_Actions)
endfunction
[/code]
 

FEARKILLERДата: Пятница, 30 Августа 2013, 04:51:49 | Сообщение # 2
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
Цитата (demon_nrt)
Я знаю что он плохо написан

Очень.
Цитата (demon_nrt)
Я хочу попросить оптимизировать этот код. А то когда используешь способность карта подлагивает, а когда используешь часто, то лаги не проходят.

Твой побоялся код проверять, но переписанный проверил, лагов нет. Но я не знаю что за абилки у даммика, так что возможно ещё из-за них лагает, если там за основу взяты абилки деформирующие землю, но опять же я не увидел в твоём коде приказы даммику что либо кастовать, но повышение уровня какой-то абилки даммику есть. Одним словом, урон то где? Я не стал особо разбираться с этим, и переписал как было, урон сам прикрутишь.

И ещё, для чего ты это делаешь?
Код
set TargX = 0.00
set TargY = 0.00
set TargA = 0.00
set Fr = 0.00

Ты логические ещё обнулять не пробовал? Вообщем целочисленные, реальные и логические не требуют обнуления, а также строки, хотя им в отличии от предыдущих типов можно присвоить значение null. Ну и если переменная глобальная, то её тоже обнулять не нужно, потому что ты её перезаписываешь каждый раз и смысл в таком обнулении?

Код
function KrovavyRekaLoop takes nothing returns nothing
     local integer h=GetHandleId(GetExpiredTimer())
     local unit u=LoadUnitHandle(udg_Hash,h,1)
     local unit d=LoadUnitHandle(udg_Hash,h,2)
     local real a=GetUnitFacing(d)
     local real x1=LoadReal(udg_Hash,h,3)
     local real y1=LoadReal(udg_Hash,h,4)
     local real x2=GetWidgetX(d)+50.*Cos(a*bj_DEGTORAD)
     local real y2=GetWidgetY(d)+50.*Sin(a*bj_DEGTORAD)
     call SetUnitX(d,x2)
     call SetUnitY(d,y2)
     if SquareRoot((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))>1200. then
         call RemoveUnit(d)
         call FlushChildHashtable(udg_Hash,h)
         call PauseTimer(GetExpiredTimer())
         call DestroyTimer(GetExpiredTimer())
     endif
     set u=null
     set d=null
endfunction
function KrovavyReka takes unit u,timer t returns nothing
     local integer h=GetHandleId(t)
     local real x=GetWidgetX(u)
     local real y=GetWidgetY(u)
     local unit d=CreateUnit(GetTriggerPlayer(),'e00P',x,y,GetUnitFacing(u))
     call SetUnitAbilityLevel(d,'A04V',GetUnitAbilityLevel(u,'A04U'))
     call SaveUnitHandle(udg_Hash,h,1,u)
     call SaveUnitHandle(udg_Hash,h,2,d)
     call SaveReal(udg_Hash,h,3,x)
     call SaveReal(udg_Hash,h,4,y)
     call TimerStart(t,.05,true,function KrovavyRekaLoop)
     set u=null
     set d=null
     set t=null
endfunction
function KrovavyRekaCond takes nothing returns boolean
     if GetSpellAbilityId()=='A04U'then
         call KrovavyReka(GetTriggerUnit(),CreateTimer())
     endif
     return false
endfunction
function InitTrig_Krovavy_reka takes nothing returns nothing
     local trigger t=CreateTrigger()
     local integer i=0
     loop
         call TriggerRegisterPlayerUnitEvent(t,Player(i),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
         exitwhen i>14
         set i=i+1
     endloop
     call TriggerAddCondition(t,Condition(function KrovavyRekaCond))
     set t=null
endfunction


Делаю из воды вино, хожу по воде...
 

demon_nrtДата: Пятница, 30 Августа 2013, 09:05:57 | Сообщение # 3
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
А у дамика встроенная абилка,а урон наноситься волной силы. То есть летит дамик с аурой, а волна силы наносит урон. Просто я боюсь пользоваться pick every unit ибо боюсь что использую ее не правильна и она сильно засоряет память.

Добавлено (30 Августа 2013, 08:48:50)
---------------------------------------------
Попытался воспроизвести ваш код, но ничего не происходит. Хоть все равкоды совпадают.

Добавлено (30 Августа 2013, 09:01:07)
---------------------------------------------
Большое спасибо, полностью разобрался. Кстати у меня еще 1 вопрос))
Как сделать так чтобы юнит проходил сквозь юнитов, но не рельеф.
И еще 1 вопрос чтобы не создавать миллион тем.

Как точку GetSpellTargetLoc() сделать в виде x,y то есть координат.

Добавлено (30 Августа 2013, 09:05:57)
---------------------------------------------

Цитата (FEARKILLER)

Твой побоялся код проверять, но переписанный проверил, лагов нет. Но я не знаю что за абилки у даммика, так что возможно ещё из-за них лагает, если там за основу взяты абилки деформирующие землю, но опять же я не увидел в твоём коде приказы даммику что либо кастовать, но повышение уровня какой-то абилки даммику есть. Одним словом, урон то где? Я не стал особо разбираться с этим, и переписал как было, урон сам прикрутишь.

А как собственно его прикрутить? Именно в ваш код. Я могу через Pick every unit, но вроде как там нужны точки. Покажите еще с пиком юнитов буду благодарен. А раньше я вместе с этим скилом запускал волну силы, то есть она по тому же пути летела что и наш дамик. Она и наносила урона, но она деформировала землю, может быть и за нее и лагало сильно.
 

SirNikolasДата: Пятница, 30 Августа 2013, 10:47:15 | Сообщение # 4
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата (demon_nrt)
Как точку GetSpellTargetLoc() сделать в виде x,y
GetSpellTargetX/Y
Цитата (demon_nrt)
Я могу через Pick every unit, но вроде как там нужны точки.
Отряд, ForGroup, Grouploop. Использовать одну глобальную группу.

Добавлено (30 Августа 2013, 10:47:15)
---------------------------------------------
P. S. demon_nrt, пиши код в теге code=jass. Он автотабулируется и подсвечивается.


 

FEARKILLERДата: Пятница, 30 Августа 2013, 12:37:44 | Сообщение # 5
6 уровень
Группа: Проверенные
Сообщений: 175
Награды: 0
Репутация: 149
Блокировки:
Цитата (demon_nrt)
урон наноситься волной силы

Боишся пикать юнитов и наносить урон? Тогда замени свою "Волна силы" на "Тёмная стая", точно такая же абилка, но без деформации.
Цитата (demon_nrt)
может быть и за нее и лагало сильно.

Не может, а из-за неё, также все прочие абилки деформирующие рельеф.
Цитата (demon_nrt)
Как точку GetSpellTargetLoc() сделать в виде x,y то есть координат.

Насчёт этого тебе уже подсказали, но я ещё дополню, что есть такой файл в варике как common.j, его извлеки из архивов вара и открой в любом текстовом редакторе, там весь список функций. Вот там можешь поискать похожие, которые работают не с точками, а напрямую с координатами X/Y.


Делаю из воды вино, хожу по воде...
 

demon_nrtДата: Пятница, 30 Августа 2013, 16:17:13 | Сообщение # 6
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Цитата (SirNikolas)
GetSpellTargetX/Y

А как ею пользоваться? То есть мне нужно создать юнита в этой области GetSpellTargetLoc. А мне нужно через координаты X|Y найти эту точку.
 

DragoNДата: Пятница, 30 Августа 2013, 18:01:46 | Сообщение # 7
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Цитата (demon_nrt)

А как ею пользоваться? То есть мне нужно создать юнита в этой области GetSpellTargetLoc. А мне нужно через координаты X|Y найти эту точку.

real x = GetSpellTargetX()
real y = GetSpellTargetY()
и при создание через CreateUnit указываешь в координаты создания эти x,y


El Psy Congroo
 

SirNikolasДата: Пятница, 30 Августа 2013, 18:18:22 | Сообщение # 8
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
[code=jass]call CreateUnit(GetOwningPlayer(GetTriggerUnit()), 'h000', GetSpellTargetX(), GetSpellTargetY(), .0)[/code]

 

demon_nrtДата: Пятница, 30 Августа 2013, 23:03:43 | Сообщение # 9
6 уровень
Группа: Проверенные
Сообщений: 193
Награды: 0
Репутация: 2
Блокировки:
Большое спасибо, очень помогло.
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz