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

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

Ответ
 
Drulia_san
Великий Дрюля жив.
offline
Опыт: 1,942
Активность: 0
Как правильно использовать таймеры вместо вейтов
Я много слышал, что TriggerSleepAction это очень кривая штуковина, которая работает с низкой точностью, временами лагами и еще продолжает работать под паузой. Но вместо этого как я понял можно юзать таймеры. Нигде не нашел какого-либо внятного гайда, который объясняет как делать таймер который выполняет функцию вейта в триггере. Как это сделать?
________________
Настоящий гений никогда не скажет, что он гений. По себе знаю.
Старый 18.03.2014, 22:16
ScorpioT1000
Только вперёд!
offline
Опыт: отключен
vjass + cjass:
#include "cj_types.j"

int test_i = 100500;
string test_s = "hello ";

void test () {
    // ... before
    
    TimerStart(CreateTimer(), 5.0, false, lambda void() {
        DestroyTimer(GetExpiredTimer());
        
        // ...after
        BJDebugMsg(test_s+I2S(test_i));
        
    });
}
и можно продолжать в том же духе:
    // ... before
    TimerStart(CreateTimer(), 5.0, false, lambda void() {
        DestroyTimer(GetExpiredTimer());
        
        // ...after

        TimerStart(CreateTimer(), 10.0, false, lambda void() {
            DestroyTimer(GetExpiredTimer());
            
            // ...after after
            BJDebugMsg(test_s+I2S(test_i));
            
        });
        
    });
главная проблема, что надо создавать глобалки для этого (с префиксом, а лучше заключить в library), иначе никак
щас в javascript, а точнее node.js всё на таких штуках построено, правда там локальные переменные включаются в лямбда-выражения (замыкание)
Старый 18.03.2014, 23:30
Drulia_san
Великий Дрюля жив.
offline
Опыт: 1,942
Активность: 0
ScorpioT1000, а если я хочу сделать функцию, которая плавно двигает юнита, концепция такой функции правильна?
Но сколько я не пытался понять так и не понял, почему спинлок замыкается на первом же прогоне цикла, юнит тупо стоит и не двигается дальше
Код:
void SlideUnitToPoint(unit u, location p, float v)
{
    local float velocity = v * SLIDE_PERIOD;
    local float distance = DistanceBetweenPoints(GetUnitLoc(u), p);
    local float direction = AngleBetweenPoints(GetUnitLoc(u), p);
    local float x;
    local float y;
    local timer t;
    while(distance > = 30)
    {
        x = GetUnitX(u) + velocity * Cos(direction * bj_DEGTORAD);
        y = GetUnitY(u) + velocity * Sin(direction * bj_DEGTORAD);
        SetUnitPosition(u, x, y);
        distance = DistanceBetweenPoints(GetUnitLoc(u), p);
        t = CreateTimer();
        SaveBoolean(DataExchange, GetHandleId(t), 0, true);
        TimerStart(t, SLIDE_PERIOD, false, lambda void() 
        {
            SaveBoolean(DataExchange, GetHandleId(GetExpiredTimer()), 0, false);
            DestroyTimer(GetExpiredTimer());
        });
        while(LoadBoolean(DataExchange, GetHandleId(t), 0)) {} //Эта штука замыкается на первом же разе и дальше не отпускается
    }
}
________________
Настоящий гений никогда не скажет, что он гений. По себе знаю.

Отредактировано Drulia_san, 19.03.2014 в 00:06.
Старый 18.03.2014, 23:47
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 19,953
Активность: 10537
Участник проектов:
-Литература
-Блог им. nvc123
-Пекарня
Drulia_san, если нужно чтобы код выполнялся после какого-то промежутка времени, то заключи эти действия в ф-ию и запускай её таймером... TimerStart(...)
Buulichkaa добавил:
естесно, удалять таймер надо когда прожектил уже долетел (ну или когда сделалось то что надо)
Старый 19.03.2014, 00:54
ScorpioT1000
Только вперёд!
offline
Опыт: отключен
вайл не надо, надо стек делать из инстансов структур и periodic задать в true, while убрать
никто не делает движение циклом
ScorpioT1000 добавил:
вот посмотри xgm.guru/forum/showpost.php?p=1265389&postcount=2
Старый 19.03.2014, 00:58
Drulia_san
Великий Дрюля жив.
offline
Опыт: 1,942
Активность: 0
Всем спасибо, разобрался!
________________
Настоящий гений никогда не скажет, что он гений. По себе знаю.
Старый 22.03.2014, 22:39
Ответ

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

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

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

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



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