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

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

Ответ
 
CAH9KoT

offline
Опыт: 198
Активность:
boolexpr как с ними работать?
Кто знает, обьясните: как работать с boolexpr, как они работают и если можно приведите примеры. заранее благодарен.
Старый 11.02.2010, 07:33
XOR

offline
Опыт: 38,159
Активность:
это фильтры
bool lol (){ return true }
void lol2 (){
...
boolexpr b = Condition(function lol)
TriggerRegister...(, b)
}
Старый 11.02.2010, 10:08
agentex

offline
Опыт: 34,834
Активность:
химикс ты зачем сижасс новичку суешь?
Вот пример на чистом джассе для начала:
function filterfunc takes nothing returns boolean
  return true
endfunction

function a takes nothing returns nothing
local boolexpr bx = Filter(function filterfunc)
endfunction
чаще всего используются в груп пиках
Старый 11.02.2010, 11:10
alexkill

offline
Опыт: 18,872
Активность:
выписка из оглавления "Академии":
Старый 11.02.2010, 11:27
CAH9KoT

offline
Опыт: 198
Активность:
agentex:
химикс ты зачем сижасс новичку суешь?
Вот пример на чистом джассе для начала:
function filterfunc takes nothing returns boolean
  return true
endfunction

function a takes nothing returns nothing
local boolexpr bx = Filter(function filterfunc)
endfunction
чаще всего используются в груп пиках
Спс. Но сжасс и вжасс я знаю)
Мне нужно в группу добавить юнитов которые являются для игрока N врагами и которые не являются мертвыми как я понял это надо делать так:
globals
player xxxPlayer
unit xxxUnit
endglobals
boolean xxxFilter(){
return (GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0) and (IsUnitEnemy(GetFilterUnit(),xxxPlayer))
}
nothing xxxDamage(){
call UnitDamageTarget(xxxUnit,GetEnumUnit(),GetRandomReal(1,900),false,false,ATTACK_TYPE_CHAOS,DAMAGE_TYP​E_POISON,WEAPON_TYPE_WHOKNOWS)
}
nothing SomeFunct(unit u){
local group g
local boolexpr b = Filter(function xxxFilter)
set xxxPlayer = GetOwningPlayer(u)
set xxxUnit = u
set g = CreateGroup()
call GroupEnumUnitsInRange(g,0,0,400,b)
call ForGroup(g,function xxxDamage)
call DestroyBoolExpr(b)
set b = null
set xxxPlayer = null
set xxxUnit = null
}
если гдето ошибка, сообщите

Отредактировано CAH9KoT, 12.02.2010 в 07:34.
Старый 12.02.2010, 06:35
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Использовать ForGroup незачем, можно всё делать сразу в фильтре. Если знаешь цДжасс, то используй лямбды (анонимная функция-фильтр), напишу пример на цинке
Код:
//! zinc
library A  {
    unit u_tmp, u_enum;
    player p_tmp;
    group  g_tmp;

    public function SomeFunc(unit u)  
    {
        u_tmp=u;
        p_tmp=GetOwningPlayer(u);
        GroupEnumUnitsInRange(g_tmp, GetUnitX(u), GetUnitY(u), 400., Filter(
            function() -> boolean  
            {
                u_enum = GetFilterUnit();
                if( ! IsUnitType(u_enum,UNIT_TYPE_DEATH) && IsUnitEnemy(u_enum, p_tmp))
                    UnitDamageTarget(u_tmp, u_enum, GetRandomReal(1.,900.), false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS);
                return false;
            })
        );
        u_enum = null;
        u_tmp = null;
    }

    function onInit()  
    {
        g=CreateGroup();
    }
}
//! endzinc
Boolexpr-ешны не текут, так что хранить их в отдельной переменной нет смысла, равно как и обнулять переменную игрока. ГРуппа служит просто временным объектом, который всегда остаётся пустым.
Старый 12.02.2010, 08:06
Arty3ooo
...
offline
Опыт: 3,125
Активность:
Цитата:
Boolexpr-ешны не текут, так что хранить их в отдельной переменной нет смысла

Оо с какого раза? Всегда было так:

Код:
boolexpr lol=Condition(function pew)
GroupEnumUnitsInRange(g,x,y,100.,lol)
ForGroup(g,function do_something)
DestroyBoolexpr(lol)
lol=null


ps: наконец увидел зинк в действии.. удобно с фильтрами работать.. прикрутить бы подобное к сджассу.
Старый 12.02.2010, 09:09
DioD

offline
Опыт: 45,134
Активность:
просто очень и очень многие люди глупые и ограниченные, слепо следуют таким же авторам статей.
удалять boolexpr ни в коем случае нельзя, это статичная функция, за исключением возврата
And() Or() Not()
которые кстати вообще использовать нельзя так как они делают тоже самое что операторы языка.
Старый 12.02.2010, 09:33
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
удобно с фильтрами работать.. прикрутить бы подобное к сджассу.
оно же и есть уже, я же говорю - то же самое на cJass-е с лямбдами.
Старый 12.02.2010, 10:14
adic3x

offline
Опыт: 108,439
Активность:
g=CreateGroup();
можно сразу писать в глобалках)
то же самое на cJass-е с лямбдами
сейчаспример дам)
library A  {
    group g_temp = CreateGroup()
    player p_temp
    unit u_temp, u_enum

    nothing fx (unit u) {
        u_temp = u
        p_temp = GetOwningPlayer(u)
        GroupEnumUnitsInRange(g_temp, GetUnitX(u), GetUnitY(u), 400., Condition(lambda boolean () {
            u_enum = GetFilterUnit()
            if (!IsUnitType(u_enum, UNIT_TYPE_DEATH) && IsUnitEnemy(u_enum, p_temp)) {
                UnitDamageTarget(u_temp, u_enum, GetRandomReal(2., 512.), false, false, ATTACK_TYPE_CHAOS,\
                                 DAMAGE_TYPE_POISON, WEAPON_TYPE_WHOKNOWS)
            }
        }))
    }
}
ADOLF добавил:
DestroyBoolexpr(lol)
никогда так не поступайте. дело в том что логические выражения не создают утечек, и уничтожив его вы уничтожите его полность, в результате чего другие переменные, ссылающееся на логическое выражение, образованное из той же функции соснут
ADOLF добавил:
ну диод все правильно сказал про логические выражения
Старый 12.02.2010, 16:37
Ответ

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

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

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

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



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