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

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

Закрытая тема
 
Uncolo

offline
Опыт: 580
Активность:
создание действий через массив
возникла такая потребность, но как зделать такое:
Код:
loop
    call Unit[i].AddAction(function F1)

    set i = i+1
exitwhen i==10
endloop


call Unit[i].AddAction(function F1) - привяжет действие к юнитам в массиве, но в одну функцию

вот вопрос: как привязать к каждому юниту свою функцию?

создавать без цикла это понятно, а вот как через цикл? если возможно... просто число 10 далеко не окончательное, это только пример
Старый 08.05.2012, 00:35
Hanabishi
COOL STATUS
offline
Опыт: отключен
Нельзя создавать массив code. Но можно массив string и делать ExecuteFunc.
Старый 08.05.2012, 00:38
Uncolo

offline
Опыт: 580
Активность:
Hanabishi, мне бы пример, а то не очень то пока понял
Старый 08.05.2012, 00:42
Hanabishi
COOL STATUS
offline
Опыт: отключен
Твоя структура:
struct sUnit
    ...
    string func
endstruct

globals
    ...
    sUnit array Unit //если глобалка
endglobals
Где-то в нужном месте задаёшь значение:
set Unit[i].func = "SomeFunc"
Потом где надо вызываешь:
call ExecuteFunc(Unit[i].func)
Старый 08.05.2012, 01:09
ScorpioT1000
Работаем
offline
Опыт: отключен
Кстати, если интересно, это может быть реализовано как классы, а не функции ru.wikipedia.org/wiki/Наблюдатель_%28шаблон_проектирования%29
Т.е. observer(handler) - это заменит твою функцию, а observable - это тот, кто их вызывает
вот, alexprey показал это на примере)

Отредактировано ScorpioT1000, 08.05.2012 в 03:02.
Старый 08.05.2012, 02:16
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Uncolo, побыстрому навалял на vJass
((код vjass
interface IEventHandler
method OnSomeEvent takes integer someInt returns nothing
endinterface
...
struct someHandler extends IEventHandler
method OnSomeEvent takes integer someInt returns nothing
call BJDebugMsg("+)")
endmethod
endstruct
...
set Unit[i].AddEventHadler(someHandler.create())
...
struct Unit
private IEventHandler array handlerList [16]
private integer handlerCount = 0
...
method CallHandler takes nothing returns nothing
local integer i = .handlerCount - 1
loop
exitwhen i < 0
call .handlerList[i].OnSomeEvent(someInt)
set i = i - 1
endloop
endmethod
method AddEventHandler takes IEventHandler handler returns boolean
if .handlerCount >= 16 or handler == 0 then
return false
endif
set .handlerList[.handlerCount] = handler
set .handlerCount = .handlerCount + 1
return true
endmethod
...
endstruct
))
Старый 08.05.2012, 02:57
Uncolo

offline
Опыт: 580
Активность:
alexprey, во, то что надо, спасибо!

ScorpioT1000, паблишеры я еще в универе давно прошел) просто я не до конца все фишки изучил в препроцессорах
Старый 08.05.2012, 12:11
adic3x

offline
Опыт: 108,439
Активность:
А я бы, как низкоуровневый программист, просто бы добавил к структуре одно int поле, и работал бы с ним бинарно (правда в jass это будет представлять некое шаманство, с массовым делением и умножением с переполнением):
// cJass

#define {
    FUNC_FOO = 0x00000001
    FUNC_BAR = 0x00000004
    FUNC_XXX = 0x0000000a
}

int AddFunc (int i, int func_id) {
    if (i * func_id / 0x40000000) == 0x00) {
        return i + 0x40000000 / func_id;
    }
    return i;
}

int RemoveFunc (int i, int func_id) {
    if (i * func_id / 0x40000000) != 0x00) {
        return i - 0x40000000 / func_id;
    }
    return i;
}

bool Execute (int i, int func_id) {
    if (i * func_id / 0x40000000) == 0x00) { return false; }
    if (func_id == FUNC_FOO) { foo () ; }
    if (func_id == FUNC_BAR) { bar () ; }
    if (func_id == FUNC_XXX) { bar () ; }
    return true;
}
Старый 08.05.2012, 15:48
Закрытая тема

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

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

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

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



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