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

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

Закрытая тема
 
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Немного уличной магии:)
Решил немного отдохнуть, пописать чонить интересное, ну и результат получился довольно таки занятный, по этому решил засветить результат.
Тут я объявляю эвент и описываю действие которое должно произойти после эвента:
library Test initializer Init
{

    OnEvent(EVENT_PLAYER_UNIT_DROP_ITEM,BJDebugMsg("!"););  
     // вместо дебага может быть просто вызов функции.
}
library SpellTEST initializer Init
{
    OnConditionEvent(EVENT_PLAYER_UNIT_SPELL_EFFECT, GetSpellAbilityId() == 'A000', BJDebugMsg("!!!"))
     // вместо проверки абилки, может быть вызов функции. Функция обязательно должна возвращать булевое значение. Вместо экшена так же может быть вызов функции.
}
» тыщи строк кода
library EventLib initializer INIT
{

filterfunc FF = null

#define OnEvent(e, jassCode) = 
{
    private void Action()
    {
        jassCode
    }
    
    RegisterEvent(e, function Action);
}

#define OnConditionEvent(e, conditionJassCode, jassCode) = 
{
    private void Action()
    {
        jassCode
    }
    
    private bool EventCondition()
    {
        return conditionJassCode
    }
    
    RegisterConditionEvent(e, function EventCondition, function Action);
}


#define RegisterEvent(e, action) =
{
    private void Init()
    {
        trigger t = CreateTrigger();
        int i = 0;
        loop
            exitwhen i > 15
            TriggerRegisterPlayerUnitEvent(t, Player(i), e, FF)
            i++;
        endloop
        TriggerAddAction(t, action);
        t = null;
    }
}

#define RegisterConditionEvent(e, cond, action) =
{
    private void Init()
    {
        trigger t = CreateTrigger();
        int i = 0;
        loop
            exitwhen i > 15
            TriggerRegisterPlayerUnitEvent(t, Player(i), e, FF)
            i++;
        endloop
        TriggerAddCondition(t, Condition(cond))
        TriggerAddAction(t, action);
        t = null;
    }
}

private constant bool ReturnTrue()
{
    return true
}

private void INIT()
{
    FF = Filter(function ReturnTrue)
}

}
Вы наверно не поверите, но это работает:)

Отредактировано Faion, 10.06.2012 в 16:12.
Старый 10.06.2012, 15:28
youtube
сктыщь
offline
Опыт: 8,025
Активность:
Это вообще законно?
Старый 10.06.2012, 15:48
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
youtube:
Это вообще законно?
В смысле?:)
Старый 10.06.2012, 15:52
Doc

offline
Опыт: 63,163
Активность:
callback onUnitDropItem(){
	BJDebugMsg("!")
}
Старый 10.06.2012, 15:54
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Doc, вот только в старом cjass'e этого нету, а на новый я не спешу переходить, ибо как мне известно он до сих пор недостаточно стабилен:)
Старый 10.06.2012, 15:58
Doc

offline
Опыт: 63,163
Активность:
Если писать, не используя всякие ненужные фишки вжасса - вполне стабилен.
Старый 10.06.2012, 15:59
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
upd: добавил пример с кондишином :)
Faion добавил:
Doc, бтв, на самом деле тут цель не заменить калбеки, а скорее показать что может препроцессор, ведь многие до сих пор не знают, что внезапно можно передавать аргументы и вообще оборачивать целые функции, тем самым избегая лишних вызовов, уж не говоря о том, что можно куски кода вместо аргументов подставлять.
Старый 10.06.2012, 16:06
Msey
????
offline
Опыт: 67,346
Активность:
Небольшой круг возможностей. Все таки я лучше буду использовать старый добрый vjass с ненужными фишками. Буду пользоваться сижасом только когда он будет работать корректно с вж.
Старый 10.06.2012, 16:29
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Msey, фича не в возможностях, это просто упрощение, ибо зачем писать много строк кода, когда можно все сделать в 1, а результат одинаковый + человеческого эффекта меньше => стабильность выше.
Старый 10.06.2012, 16:32
Msey
????
offline
Опыт: 67,346
Активность:
Ну не знаю. Мне проще написать лишний десяток строк кода, чтобы потом не запутаться в такой конструкции, как у тебя например. Каждому свое.
Старый 10.06.2012, 16:38
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Ну тебе проще только потому что больших проектов не делаешь. А когда делаешь действительно большой проект, кол-во строк кода становятся проблемой, у меня когда случается перебор с кодингом, начинают болеть пальцы))
А путаться тут негде, код под спойлером тупо копипастится и забывается. А что касается вызова, то думаю в 1 строчке нереально запутаться :)
Старый 10.06.2012, 16:46
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Смысл в теме? Показать возможности сжасса? Показать хитрую функцию? Обсудить преимущества\недостатки версий сжасса? Обсудить личные предпочтения?
Показать - показал
Обсудить - обсудили
Закрыто
ну и таки да - можешь добавить код в библиотеку функций
Старый 10.06.2012, 17:23
Doc

offline
Опыт: 63,163
Активность:
Msey, тащемта я не вижу реально нужных возможностей вжасса которые бажно работают с сжассом. Текстмакро? Зачем? Модули? Нафига? Основные фишки ооп, т.е. структуры, наследование, интерфейсы, стабы работают и ладно.
Старый 10.06.2012, 17:30
Закрытая тема

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

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

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

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



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