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

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

Ответ
 
Hares
полупротосс
offline
Опыт: 6,966
Активность:
Event: Generic Unit - Получает урон
Поскольку постоянно спрашивают, как это делать, предлагаю событие. Написано на гибриде C# и cJass.
» Сам код.
Если в карте этого нет, то добавьте:
((код
define
{
bool = boolean;
void = nothing;
int = integer;
}
))
Непосредственно:
((код
globals
trigger array Owners;
int OwnerBounty = 0;
group array RegistredUnits;
endglobals
bool UnitTakesDamage_Filter()
{
unit u = GetFilterUnit();
if (u == null)
{u = GetEnumUnit()}
int i = 0;

loop
{
exitwhen i >= OwnerBounty

if !(IsUnitInGroup(u, RegistredUnits[i]))
{
TriggerRegisterUnitEvent(Owners[i], u, EVENT_UNIT_DAMAGED);
GroupAddUnit(RegistredUnits[i], u);
}
i++;
}

u = null; return false;
}
event TriggerAddEventUnitTakesDamage(trigger Owner)
{
if (OwnerBounty == 0)
{
trigger t = CreateTrigger();
region r = CreateRegion();

RegionAddRect(r, bj_mapInitialCameraBounds);
TriggerRegisterEnterRegion(t, r, function UnitTakesDamage_Filter);
}

RegistredUnits[OwnerBounty] = CreateGroup();
Owners[OwnerBounty] = Owner;
OwnerBounty++;

group g = CreateGroup();
GroupEnumUnitsInRect(g, bj_mapInitialPlayableArea, null);
ForGroup(g, function UnitTakesDamage_Filter);
DestroyGroup(g);

t = null; r = null; g = null; return null;
}
))
Всё проверено, работает. В ближайшем времени выложу карту-пример и систему отображения урона (texttag'ами). Хотя нет, пожалуй напишу систему энергощитов для юнитов. =)

Отредактировано Hares, 03.01.2012 в 00:50.
Старый 02.01.2012, 01:36
Doc

offline
Опыт: 63,163
Активность:
Омфг глупо и вооще глупо. Зачем столько проверок.
Старый 02.01.2012, 01:42
MyRtZ

offline
Опыт: 6,530
Активность:
систему отображения урона (texttag'ами).
Знали бы ты сколько таких систем - не вылаживали бы
Где инициализация переменных
Почему вырван код? Приведите его в нормальное состояние
{
    trigger t = GetTriggeringTrigger();
    group   g = LoadGroupHandle(cache, Trig(t), Gr);
    group   Any = CreateGroup()
    
    AnyUnit(Any)
    
    ForGroup(Any, function UnitTakesDamage_Picking);
    
    GroupClear(g);
    bj_groupAddGroupDest = g;
    ForGroup(Any, function GroupAddGroupEnum);
    
    SaveGroupHandle(cache, Trig(t), Gr, g);
    
    g = null; Any = null; t = null;
}
Куда пропало DestroyGroup(Any) ?
void UnitTakesDamage_Picking()
{
    group   g = LoadGroupHandle(cache, Trig(TRIG), Gr);
    unit    u = GetEnumUnit();
    
    if !(IsUnitInGroup(u, g))
    {
        TriggerRegisterUnitEvent(OWNER, u, EVENT_UNIT_DAMAGED);
        g = null; u = null;
    }
}
Что это за очистка переменных при условии?
Код дикий по своей специфике работы, легче создать триггер который регистрирует в группу и в главный триггер как event в случае вхождения юнита в область, если тот не в группе

Отредактировано MyRtZ, 02.01.2012 в 02:44.
Старый 02.01.2012, 01:50
Hares
полупротосс
offline
Опыт: 6,966
Активность:
Doc:
Омфг глупо и вооще глупо. Зачем столько проверок.
Что глупо то? Проверок мало.
MyRtZ:
Куда пропало DestroyGroup(Any) ?
Вот это - единственное, с чем согласен. Потерял, просто много вариантов было.
MyRtZ:
Знал бы ты сколько таких систем - не вылаживал бы
Знаю. Далеко не все - нормальные.
MyRtZ:
Что это за очистка переменных при условии?
Это не условие, а действие.
MyRtZ:
Дэфайны не умеем делать?
Если Вы читали мануал Адольфа, то поняли бы, что никакого конфликта не возникает. Слева вместо t могло стоять и zu, но тогда же он и стояло бы справа.
MyRtZ:
Почему вырван код? Приведи его в нормальное состояние
Что именно вырвано?
Это - целиком и полностью написанная функция. Карту пока выкладывать смысле нет.
MyRtZ:
Где инициализация переменных
Которых?
Все, что необходимы, иницированы.
СОРИ.
Забыл про кусок кода, он просто вверху был.
отредактировал пост.
Hares добавил:
Хотя в том коде всего 2 строки.
Старый 02.01.2012, 02:37
MyRtZ

offline
Опыт: 6,530
Активность:
Hares:
Doc:
Омфг глупо и вооще глупо. Зачем столько проверок.
Что глупо то? Проверок мало.
Проверок чуть больше, чем много
MyRtZ:
Что это за очистка переменных при условии?
Это не условие, а действие.
Чистка происходит в блоке оператора if, в этом случае переменные очищаются тогда, когда юнит не в группе
Старый 02.01.2012, 02:49
Hares
полупротосс
offline
Опыт: 6,966
Активность:
MyRtZ:
Чистка происходит в блоке оператора if, в этом случае переменные очищаются тогда, когда юнит не в группе
Понял. Исправим.
MyRtZ:
Проверок чуть больше, чем много
Ровно столько, столько надо. Или Вы знаете другой способ проверить всех юнитов, не приписывая всем подряд условие?
Hares добавил:
Ничего. На ошибках учатся.
Старый 02.01.2012, 02:55
MyRtZ

offline
Опыт: 6,530
Активность:
Hares:
Проверок чуть больше, чем много
Ровно столько, столько надо. Или Вы знаете другой способ проверить всех юнитов, не приписывая всем подряд условие?
Имеются ввиду эти операции:
  group Any = CreateGroup()
  GroupEnumUnitsInRect(Any,bj_mapInitialPlayableArea,null)
  GroupClear(g)
  bj_groupAddGroupDest = g
  ForGroup(Any, function GroupAddGroupEnum)
Это выполняется в твоем коде каждые 0.01 сек.
Представь что в карте 175 едениц пускай даже с PERIODIC равном 0.05, что будет?
Hares:
Или Вы знаете другой способ проверить всех юнитов
MyRtZ:
Код дикий по своей специфике работы, легче один раз сделать пик юнитов и создать триггер который регистрирует в группу и в главный триггер как event в случае вхождения юнита в область, если тот не в группе
Старый 02.01.2012, 03:08
Elf_Stratigo

offline
Опыт: 4,699
Активность:
омг, вырывать бы руки за такой код
посмотрите другие аналогичные системы, там затрачивается в разы меньше ресурсов, при этом достигается нужный результат
Старый 02.01.2012, 12:53
MyRtZ

offline
Опыт: 6,530
Активность:
мне больше эта строчка понравилась:
    if (!CacheIsInitialisated)
        {cache = InitHashtable()}
Каждый раз когда когда запускаем мы инитиализируем хэш-таблицу снова.
» Внимание, правильный ответ для автора(другие поймут)
    if (!CacheIsInitialisated)
        {cache = InitHashtable(); CacheIsInitialisated = true}
Старый 02.01.2012, 14:42
Hares
полупротосс
offline
Опыт: 6,966
Активность:
MyRtZ:
Это выполняется в твоем коде каждые 0.01 сек.
Представь что в карте 175 едениц пускай даже с PERIODIC равном 0.05, что будет?
Я проверял. При битве 48 на 48 даже не лагало. При условии, что у меня была запущена Мозила, жрущая 300 мб памяти и учитывая то, что у меня очень-приочень глючной комп. (он глючил даже тогда, пока я набирал это)
MyRtZ:
Код дикий по своей специфике работы, легче один раз сделать пик юнитов и создать триггер который регистрирует в группу и в главный триггер как event в случае вхождения юнита в область, если тот не в группе
Это событие дольше срабатывает. Ибо Вару приходится каждое мгновение проверять, не зашёл ли наш юнит в регион "Вся карта", при этом всё равно берутся все юниты в массив и проверяются их координаты. Работать будет одинаково по времени.
MyRtZ:
Каждый раз когда когда запускаем мы инитиализируем хэш-таблицу снова.
Когда 10 000 раз исправляешь один и тот же код (до его публикации), легко что-то потерять. Ибо присвоение когда-то было.
Старый 02.01.2012, 19:45
Doc

offline
Опыт: 63,163
Активность:
Hares, напомню, что в нормальных картах обычно присутствуют НЕСКОЛЬКО систем. А вот как вар проверяет, это уже не ваше дело, native код в любом случае быстрее.
Старый 02.01.2012, 19:51
MyRtZ

offline
Опыт: 6,530
Активность:
При условии, что у меня была запущена Мозила, жрущая 300 мб памяти
Процессор, а не оперативка
Когда 10 000 раз исправляешь один и тот же код (до его публикации), легко что-то потерять.
Почему другие не теряют
Ибо Вару приходится каждое мгновение проверять, не зашёл ли наш юнит в регион "Вся карта"
Ну это оптимальнее ещемоментного пика юнитов, т.к там на движке все идет
Старый 02.01.2012, 19:53
Hares
полупротосс
offline
Опыт: 6,966
Активность:
Ну ладно. Принимайте новую версию.
Старый 03.01.2012, 00:48
MyRtZ

offline
Опыт: 6,530
Активность:
Hares:
Ну ладно. Принимайте новую версию.
    loop
    {
        exitwhen i >= OwnerBounty
        
        if !(IsUnitInGroup(u, RegistredUnits[i]))
        {
            TriggerRegisterUnitEvent(Owners[i], u, EVENT_UNIT_DAMAGED);
            GroupAddUnit(RegistredUnits[i], u);
        }
        i++;
    }
Глуповато ставить exitwhen в этой ситуации до i++ т.к это лишняя проверка, но такую мелочь можно не брать во внимание, но напоследок знай.
    if (OwnerBounty == 0)
    {
        trigger t = CreateTrigger();
        region r = CreateRegion();
        
        RegionAddRect(r, bj_mapInitialCameraBounds);
        TriggerRegisterEnterRegion(t, r, function UnitTakesDamage_Filter);
    }
    
   //actions

    t = null; r = null; g = null; return null;
}
Переменные t и r чистить надо в условии, т.к только там они принимают значение, но тоже мелочь.
В целом это больше подходит не для барахолки, а для библиотеки функций.
Не думаю что она будет востребована, но за работу спасибо
Старый 03.01.2012, 01:29
Hares
полупротосс
offline
Опыт: 6,966
Активность:
MyRtZ:
Не думаю что она будет востребована, но за работу спасибо
Это Вам спасибо. Столько со мной мучились. В ближайшем времени будет сделана система энергетических щитов, как в старкрафте.
Старый 04.01.2012, 00:42
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Перед удалением группы - чистить, небольшой прирост производительности, а если серьезно, то зачем 100500 групп? - создать 1 группу и работать только с ней, + запилить триггер реагирующий на появление новых юнитов и добавляющий их в уже имеющуюся группу.
Старый 04.01.2012, 02:37
MyRtZ

offline
Опыт: 6,530
Активность:
Faion:
Перед удалением группы - чистить, небольшой прирост производительности, а если серьезно, то зачем 100500 групп? - создать 1 группу и работать только с ней, + запилить триггер реагирующий на появление новых юнитов и добавляющий их в уже имеющуюся группу.
Может кроме моих сообщений в этой теме ты и первое посмотришь или это не твой стиль?
Перед удалением группы - чистить, небольшой прирост производительности
на практике убедился?
Старый 04.01.2012, 02:38
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
MyRtZ:
Может кроме моих сообщений в этой теме ты и первое посмотришь или это не твой стиль?
С чего вы взяли, что я читал ваши посты, мания величия? И да, в 3 часа ночи - не мой, читаю только код.
MyRtZ:
на практике убедился?
Я - нет, но верю на слово тем, кто проверял, а проверял вроде шедов.
Старый 04.01.2012, 02:49
MyRtZ

offline
Опыт: 6,530
Активность:
невижу в первом посте стопицот групп, стопицот групп только в третьем, моем, посте.
Старый 04.01.2012, 03:11
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
в глобалках group array RegistredUnits - не?
Старый 04.01.2012, 15:30
Ответ

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

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

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

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



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