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


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Anti-Stuck система
[SeKtOR]Дата: Четверг, 16 Августа 2012, 13:17:08 | Сообщение # 1
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Имеется следующий триггер
Code
function Anti_Stuck_Doing takes nothing returns nothing
     local real x
     local real y
     if (GetUnitCurrentOrder(GetEnumUnit()) == OrderId("move")) then
         set x = GetRectCenterX(udg_AS_Region[GetUnitUserData(GetEnumUnit())])
         set y = GetRectCenterY(udg_AS_Region[GetUnitUserData(GetEnumUnit())])
         call IssuePointOrder(GetEnumUnit(), "move", x, y)
     else
     endif
endfunction

function Anti_Stuck_Actions takes nothing returns nothing
     local group g = GetUnitsInRectOfPlayer(GetPlayableMapRect(), Player(11))
     call ForGroup(g, function Anti_Stuck_Doing)
     call DestroyGroup(g)
     set g = null
endfunction

//===========================================================================
function InitTrig_Anti_Stuck takes nothing returns nothing
     set gg_trg_Anti_Stuck = CreateTrigger()
     call TriggerRegisterTimerExpireEvent(gg_trg_Anti_Stuck, udg_AS_Timer)
     call TriggerAddAction(gg_trg_Anti_Stuck, function Anti_Stuck_Actions)
endfunction

Когда он пикает всех юнитов коричневого игрока, они встают на 1-1.5 сек. Естественно это для тд плохо, прощу помочь в решение данной проблемы и пнуть на верный путь как сделать чтобы пикало без ступора у юнитов trollface
P.S. udg_AS_Timer переодический таймер с временем 5 сек


 

bubliqДата: Четверг, 16 Августа 2012, 13:59:41 | Сообщение # 2
2 уровень
Группа: Пользователи
Сообщений: 24
Награды: 0
Репутация: -12
Блокировки:
1. Убрать юнитам стоимость пищи.
2. Убрать юнитам текстуру путей.
3. Добавить юнита сразу в группу (а не пикать каждый раз имеющихся юнитов на карте)
Просто давай представим, как это выглядит. У тебя есть, группа, ты воспитатель. Ты чтобы перейти дорогу, пересчитываешь всех, и говоришь левой, пересчитываешь всех, говоришь - правой, пересчитываешь. Ну ты понял. А нужно, один раз посчитать, и говорить, левой, правой, левой, правой, ну ты понял.

4. Ну офк, не буду говорить, про утечность используемых тобой методов.
 

[SeKtOR]Дата: Четверг, 16 Августа 2012, 14:49:44 | Сообщение # 3
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Поподробнее?



Сообщение отредактировал [SeKtOR] - Четверг, 16 Августа 2012, 14:50:12
 

bubliqДата: Четверг, 16 Августа 2012, 16:11:52 | Сообщение # 4
2 уровень
Группа: Пользователи
Сообщений: 24
Награды: 0
Репутация: -12
Блокировки:
globals
group MyStack = CreateGroup()
endglobals

function AddToStack takes unit u returns nothing
call GroupAddUnit(MyStack,u)
endfunction

function RemoveFromStack takes unit u returns nothing
call GroupRemoveUnit(MyStack,u)
endfunction

function Anti_Stuck_Doing takes nothing returns nothing
if (GetUnitCurrentOrder(GetEnumUnit())!= OrderId("move")) then
call IssuePointOrder(GetEnumUnit(), "move", GetRectCenterX(udg_AS_Region[GetUnitUserData(GetEnumUnit())]) , GetRectCenterY(udg_AS_Region[GetUnitUserData(GetEnumUnit())]) )
endif
endfunction

function Anti_Stuck_Actions takes nothing returns nothing
call ForGroup(MyStack, function Anti_Stuck_Doing)
endfunction

//===========================================================================
function InitTrig_Anti_Stuck takes nothing returns nothing
set gg_trg_Anti_Stuck = CreateTrigger()
call TriggerRegisterTimerExpireEvent(gg_trg_Anti_Stuck, udg_AS_Timer)
call TriggerAddAction(gg_trg_Anti_Stuck, function Anti_Stuck_Actions)
endfunction

Вот небольшая оптимизация твоей системы. Когда созадётся юнит запускай функций AddToStack, когда юнит умирает, или ты его желаешь удалить из карты - RemoveFromStack.

Добавлено (16 Августа 2012, 16:11:52)
---------------------------------------------
Хватит офк, таймера в 0.5 секунд, если и будут стопориться, то уже не так заметно как сейчас.

У тебя были три ошибки.
1. Ты постоянно баловался хендлами.
2. Сами по себе конструкции - грузные.
3. У тебя знак равенства == move -> а значит если юнит встанет, когда либо, то медный таз твоей системе.

 

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

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