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

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

Ответ
 
agentex

offline
Опыт: 34,834
Активность:
Тип boolexpr
Как задать значение локальной переменной типа boolexpr непосредственно из функции? (т.е. не создавая доп. функций). Ответьте примерами, если можно
Старый 29.07.2008, 18:39
__Dark Lord__

offline
Опыт: 5,262
Активность:
Boolexpr вроде булева переменная.
Set Var = true/false
Старый 29.07.2008, 18:58
agentex

offline
Опыт: 34,834
Активность:
ващет она не логическая совсем... это вообще отдельный тип
Старый 29.07.2008, 19:05
agentex

offline
Опыт: 34,834
Активность:
всмысле что это? я же сказал что это разные типы переменных
вот комменты из JassCraft:
type boolexpr extends handle (это описание типа boolexpr)
Wc3 Hardcoded Native (это описание типа boolean)
а при попытке boolexpr присвоить значение true(local boolexpr b = true) выдает: Cannot convert boolean to boolexpr (кто бы сомневался)
Старый 29.07.2008, 19:14
__Dark Lord__

offline
Опыт: 5,262
Активность:
Мне не понятно какой тип данных он хранит.
Не надо писать что хэндл.
Тип юнит хранит хэндл юнита.
Тип boolexpr тоже хэндл, но другой.
Старый 29.07.2008, 19:20
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
agentex, если я правильно тебя понял...
Код:
function test takes nothing returns boolean
  // просто для примера
  return true
endfunction

  // . . .
  local boolexpr bx = Condition(function test)
  // требуемые действия

Функция, указываемая для буль-выражения, обязательно должна возвращать boolean.

Отредактировано ShadoW DaemoN, 29.07.2008 в 19:35.
Старый 29.07.2008, 19:20
__Dark Lord__

offline
Опыт: 5,262
Активность:
function test вернет true
Condition (true) должно вернуть true
Вот что получается.
bx = true
Т.е либо ты не правильно привел пример. Либо я че-то не понял. Или же в bx записывается само Condition.
Т.к как в примере ты приравниваешь boolexpr значение с bool значением.
Старый 29.07.2008, 19:26
agentex

offline
Опыт: 34,834
Активность:
вот мне нужно както обойтись без функции test, в том то и дело... ну ладно, значит нельзя осуществить это, а жаль
Старый 29.07.2008, 19:38
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
__Dark Lord__, рекомендую "думать окуратно прежде чем писать" (c) DioD
Смотри:
Код:
native Condition takes code func returns conditionfunc

conditionfunc - расширение типа boolexpr. Следовательно, мой пример построен верно.
agentex, а, собственно, в чем суть проблемы? Что примерно нужно реализовать?
Старый 29.07.2008, 19:41
agentex

offline
Опыт: 34,834
Активность:
ну четкой цели у меня нету, просто хотелось бы вместо 2 функций обойтись 1, т.к. я предпочитаю чтобы все было вместе...
з.ы. речь идет об ф-ии GroupEnumUnitsInRangeOfLoc() где последний аргумент - boolexpr.
Старый 29.07.2008, 19:50
Лось

offline
Опыт: 7,223
Активность:
Ну поставь там null, потом проверяй каждого юнита по отдельности..
Старый 29.07.2008, 20:03
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
agentex, если все вместе - это не значит, что это все оптимально. Я примерно представил, как ты хочешь сделать:
Код:
local group    grp  = CreateGroup()
  local location loc  = GetSpellTargetLoc()
  local unit     enum = null
  call GroupEnumUnitsInRangeOfLoc(grp, loc, 400.0, null)
  loop
    set enum = FirstOfGroup(grp)
    exitwhen enum == null
    call GroupRemoveUnit(grp, enum)
    
    // условие взято для примера
    if GetUnitUserData(enum) > 0 then
      // некоторые действия
    endif
  endloop
  // . . .

Вроде все замечательно, все работает, но это медленно и малоэффективно.
Наоборот, гораздо лучше будет использовать здесь буль-выражение (лучше его создавать глобальной переменной, чтобы немного сэкономить).
Код:
globals
  group grp = CreateGroup()
  boolexpr bx = null
endglobals

function MyBoolExpr takes nothing returns boolean
  if GetUnitUserData(GetFilterUnit()) > 0 then
    // некоторые действия
  endif
  return false
endfunction

function run_myspell takes nothing returns nothing
  local location loc = GetSpellTargetLoc()
  call GroupEnumUnitsInRangeOfLoc(grp, loc, 400.0, bx)
  // . . .
endfunction

  // инициализация триггера
  set bx = Condition(function MyBoolExpr)
  // . . .

Что мы здесь видим?
Пример так называемого "имба-цикла". Буль-выражение задается 1 раз при инициализации триггера, что позволяет не тормошить каждый раз Condition (это занимает время). С группой то же самое. К тому же такой GroupEnum... выполняется быстрее, чем ForGroup, и уж тем более быстрее "два-в-одном" (см. первый код).
Вывод: имеет смысл использовать "имба-цикл" ^^
Старый 29.07.2008, 20:19
agentex

offline
Опыт: 34,834
Активность:
спс за разъяснение, буду юзать "имба-цикл" №1 =) хм и почему это он малоэффективен?
Старый 29.07.2008, 20:49
__Dark Lord__

offline
Опыт: 5,262
Активность:
ShadoW DaemoN, вам "думать окуратно прежде чем писать" (c) DioD
Ибо я просто спросил. И просто не посмотрел возвращаемые параметры функци Condition.
Старый 29.07.2008, 21:01
Ответ

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

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

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

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



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