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

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

Ответ
 
влад10011

offline
Опыт: 2,337
Активность:
Вопросы про TextMacro
Пару вопросов о TextMacro:

№1)Что происходит с кодом внутри TextMacro?
1)Он превращается в комментарий и при вызове RunTextMacro генерируется
2)Он остаётся на своём месте и копируется(в место вызова) при вызове RunTextMacro
3)Что то другое, о чём я не подозреваю =_=
А точнее вопрос: отправляется ли код внутри TextMacro в общий код или его невидно, пока не вызовешь?

№2)Влияют ли аргументы TextMacro на define?(например define A(s)=$type$$name$##s)
1)угу
2)нет

Отредактировано влад10011, 19.10.2012 в 22:48.
Старый 19.10.2012, 22:43
DualShock

offline
Опыт: 5,023
Активность:
textmacro нестоит юзать вместе с cjass...
остальное смотри в мануале:
» Text Macros
Данная структура позволит генерировать код, используя строчные переменные, которые могут внедряться в любую часть кода. Но, это всё статично, т.е. делаться только при сохранение карты в WE в игре таких чудес творить ясно что нельзя.

Для объявления textmacro используется следующая конструкция:
Код:
//! textmacro MyNameTextMacro takes string_var1, string_var2, string_var3,...
/*тело вставки*/
//! endtextmacro


Важно отметить, что //! не комментарий, а именно обозначение конструкции.

Что бы вставить тот текст, который находиться в соответствующем textmacro в код необходимо написать:
Код:
//! runtextmacro MyNameTextMacro("<string1>", "<string1>", "<string1>",...)

Без вызова textmacro код, находящийся в нем будет проигнорирован. При его вызове текст, находящийся в textmacro будет вставлен в код в месте вызова с указанными аргументами.

Немного запутанно, на примере думаю будет понятней:
Код:
//! textmacro t takes type, name
function MyFunc$name$ takes $type$ returns nothing
endfunction
//! endtextmacro

//! runtextmacro t("integer i", "Int")
//! runtextmacro t("real r", "Real")


Будет скомпилировано на Jass как:
Код:
//textmacro instance: t("integer i", "Int")

function MyFuncInt takes integer i returns nothing
endfunction

//end of: t("integer i", "Int")

//textmacro instance: t("real r", "Real")

function MyFuncReal takes real r returns nothing
endfunction

//end of: t("real r", "Real")


Также textmacro может вообще не брать аргументы:
Код:
//! textmacro MyText
call DoNothing()
//! endtextmacro

function MyFunc takes nothing returns nothing
//! runtextmacro MyText()
endfunction


Данная конструкция совместима с библиотеками (library) и областями (scope).

Отредактировано DualShock, 20.10.2012 в 16:02.
Старый 19.10.2012, 23:04
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
сначала мы описываем макрос типа так
//! textmacro EvadeMacro takes UNIT1,UNIT2 ,ABILITY, CONDITION, ACTION1, ACTION2
        elseif (GetUnitAbilityLevel($UNIT1$, $ABILITY$) > 0) then
            GetPassive($ABILITY$,$UNIT1$)
            $ACTION1$
            if PassImpactEffect[cPas] != "" 
            {DestroyEffect(AddSpecialEffectTarget(PassImpactEffect[cPas], $UNIT1$,PassImpactPoint[cPas]))}
            if $CONDITION$ then
                $ACTION2$
                if PassImpactEffect[cPas] != "" 
                {DestroyEffect(AddSpecialEffectTarget(PassActivationEffect[cPas], $UNIT2$,PassActivationPoint[cPas]))}
            endif
    //! endtextmacro
затем, в нужной части кода мы просто вызываем макрос
//! runtextmacro EvadeMacro("dd.vict","dd.srcs","'A003'","(GetRandomReal(0.01,100.​) <= PassiveChance[cPas][LVL])"," ","SetState(dd.vict,dd.srcs, PassiveDuration[cPas][LVL], stun, vct.CON, PassiveStateChance[cPas][LVL],src.StunRes, -7777, -7777  )")
и получится на месте вызова такой код
elseif (GetUnitAbilityLevel(dd.vict, 'A003') > 0) then
            GetPassive('A003',dd.vict)
             
            if PassImpactEffect[cPas] != "" 
            {DestroyEffect(AddSpecialEffectTarget(PassImpactEffect[cPas], dd.vict,PassImpactPoint[cPas]))}
            if (GetRandomReal(0.01,100.) <= PassiveChance[cPas][LVL]) then
                SetState(dd.vict,dd.srcs, PassiveDuration[cPas][LVL], stun, vct.CON, PassiveStateChance[cPas][LVL],src.StunRes, -7777, -7777  )
                if PassImpactEffect[cPas] != "" 
                {DestroyEffect(AddSpecialEffectTarget(PassActivationEffect[cPas], dd.srcs,PassActivationPoint[cPas]))}
            endif
забавная штука
Hate добавил:
использовать вместе с сижасс текстмакросы может не позволять наверное только религия)
Старый 19.10.2012, 23:31
влад10011

offline
Опыт: 2,337
Активность:
DualShock, Hate, Я знаю как его юзать........ =_=
я попросил ответить на вопросы в первом посту.....
Старый 20.10.2012, 08:23
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
второе вам самому проверить религия не позволяет?
Старый 20.10.2012, 10:32
DioD

offline
Опыт: 45,134
Активность:
а что мешает скомпилировать и посмотреть код, ну кроме религии, функции описывающей строение рук, точки ввода мыслей в мозг и иных объективных причин не связанных с религией?
Старый 20.10.2012, 10:49
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Юзайте дефайны, они лучше vjass макросов, ибо можно в дефайнах юзать #if #endif, макросы внутри макросов. Передавать в макросы другие макросы.
Старый 20.10.2012, 11:29
Doc

offline
Опыт: 63,163
Активность:
Faion, в макросах можно static if.
Старый 20.10.2012, 16:00
DioD

offline
Опыт: 45,134
Активность:
в макросах можно написать что угодно, это ж текст
Старый 20.10.2012, 18:04
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
DioD, нет.
Faion добавил:
Добавлю в "защиту" дефайнов vblock { } :)
Старый 20.10.2012, 18:16
DioD

offline
Опыт: 45,134
Активность:
а вот и да.
хотя может быть вы юзаете какие то неправильные макросы, но у меня пишет что я хочу при чём всегда, главное правильно задать.
Старый 21.10.2012, 12:52
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
DioD, нет. Вы просто не юзали их по максимуму, есть не мало вещей которые "недопустимы". Один из багов Адольф уже несколько месяцев "фиксит" :)
Старый 21.10.2012, 20:21
DioD

offline
Опыт: 45,134
Активность:
не пользуюсь цджазом, попробуйте буржуйский вджаз
Старый 22.10.2012, 10:56
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
DioD:
попробуйте буржуйский вджаз
Там есть аналог vblock? И аргументом может быть код?
Старый 22.10.2012, 11:05
adic3x

offline
Опыт: 108,439
Активность:
О чем спор? #define в cJass умеет все, что и textmacro в vJass и многое другое, будь то:
  • вызвать #define из строки, например #define a = 0; #define b = 1; int foo = a + b
  • корректно работать со строками, например #define bar (s) = BJDebugMsg ("s = "+`s`)
  • возможность вызова одного макроса из другого #define a = b; #define b = 0
  • перегрузка по количеству аргументов
  • дальше лень писать, но различий еще много
Старый 22.10.2012, 12:36
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ADOLF:
дальше лень писать, но различий еще много
не различий, а скорее фич, которых нету в vjass макросах, и без которых они не уперлись :nate:
Старый 22.10.2012, 13:15
Ответ

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

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

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

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



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