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

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

Ответ
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Объясните функцию
Код:
function UnitType takes nothing returns boolean
return not (IsUnitOwnedByPlayer(GetFilterUnit(), Player(0))) and (IsUnitType(GetFilterUnit(), ConvertUnitType('nmed')) or IsUnitType(GetFilterUnit(), ConvertUnitType('odkt')) or IsUnitType(GetFilterUnit(), ConvertUnitType('eshd')) or IsUnitType(GetFilterUnit(), ConvertUnitType('uktg')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hjai')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hvsh')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Ewar')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Usyl'))) 
endfunction

function VerificationRed takes real x, real y returns boolean
local group g = CreateGroup()
local integer i = 0
local unit u
local boolean b = true
    loop
    set i = i+1
    call GroupEnumUnitsInRangeOfLoc(g, Location(x, y+192*i), 100, Condition(function UnitType))
    call GroupAddUnit(g, GetEnumUnit())
    if FirstOfGroup(g) != null then
        set b = false
    endif
    exitwhen i == 8 or FirstOfGroup(g) != null
    endloop
    call DestroyGroup(g)
    set g = null
    return b
endfunction


как бы ненормально это не казалось, но данную функцию написал я..Пожалуйста, объясните, что тут возвращается (не в смысле - юнит, логическая и т.д., а в смысле тру/фолс)

Отредактировано Vampirrr, 09.02.2009 в 02:28.
Старый 09.02.2009, 02:04
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Мда... Наверное жестко заниматься вуду кодингом :-) она возвращает ложь, если твое условие правда. Если же твое условие ложь, то возвращает правду.
Старый 09.02.2009, 02:39
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Hellfim, порой бывают затруднения, но в целом все ок =) в общем спасибо, терь понял что нужно использовать в условии)

Отредактировано Vampirrr, 09.02.2009 в 21:06.
Старый 09.02.2009, 04:27
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Код:
function UnitType takes nothing returns boolean
return not (IsUnitOwnedByPlayer(GetFilterUnit(), Player(0))) and (IsUnitType(GetFilterUnit(), ConvertUnitType('nmed')) or IsUnitType(GetFilterUnit(), ConvertUnitType('odkt')) or IsUnitType(GetFilterUnit(), ConvertUnitType('eshd')) or IsUnitType(GetFilterUnit(), ConvertUnitType('uktg')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hjai')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hvsh')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Ewar')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Usyl'))) 
endfunction

function VerificationRed takes real x, real y returns boolean
local group g = CreateGroup()
local integer i = 1
local unit u
    loop
    exitwhen i >= 9 or FirstOfGroup(g) != null
    call GroupEnumUnitsInRangeOfLoc(g, Location(x, y+192*i), 100, Condition(function UnitType))
    call GroupAddUnit(g, GetEnumUnit())    
    set i = i+1
    endloop
    call DestroyGroup(g)
    set g = null
    return i >= 9
endfunction


Если подумать, то возможно можно будет еще ужать, а ваабще функция страшная и вызывает утечки. Для чего она нужна?
Старый 09.02.2009, 04:36
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
MF_Andreich, нужна для проверки..а где она утечки вызывает? O_o BJ не использую, группу что создаю удаляю..и куда ты булиан дел? мне ненужно интегер возвращать..
Старый 09.02.2009, 05:59
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Vampirrr
Возвращаеться условие! По идее то же что и в твоей функции.
утечка:
Код:
call GroupEnumUnitsInRangeOfLoc(g, Location(x, y+192*i), 100, Condition(function UnitType))

а именно
Код:
Location(x, y+192*i)

данная функция создает локацию. Удалять ее кто будет?
И смени подпись, приставки з- не существует! В словах Здание, Здесь з - часть корня
Старый 09.02.2009, 06:08
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
MF_Andreich, там нету утечки. Эта утечка создана только вампиром, а не функцией =) Для ее устранения достаточно создавать точку заранее, и использовать ее через локалку, например:
Код:
function VerificationRed takes real x, real y returns boolean
local group g = CreateGroup()
local integer i = 1
local unit u
local location loc
    loop
    exitwhen i >= 9 or FirstOfGroup(g) != null
    set loc=Location(x,y+192*i)
    call GroupEnumUnitsInRangeOfLoc(g, loc, 100, Condition(function UnitType))
    call GroupAddUnit(g, GetEnumUnit())    
    set i = i+1
    endloop
    call DestroyGroup(g)
    call RemoveLocation(loc)
    set loc=null
    set g = null
    return i >= 9
endfunction
Старый 09.02.2009, 12:48
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
Hellfim, я это и имел ввиду суть то не меняется.
Старый 09.02.2009, 13:31
alexkill

offline
Опыт: 18,872
Активность:
Код:
call GroupAddUnit(g, GetEnumUnit())
// GetEnumUnit() - не тот поток!
Код:
Location(x, y+192*i)
// никаких локаций!
Код:
return b
// что тебе конкретно нужно возвратить???

» code

Код:
globals
   integer i = 1
endglobals

function UnitType takes nothing returns boolean
    return not IsUnitOwnedByPlayer(GetFilterUnit(), Player(0)) and (IsUnitType(GetFilterUnit(), ConvertUnitType('nmed')) or IsUnitType(GetFilterUnit(), ConvertUnitType('odkt')) or IsUnitType(GetFilterUnit(), ConvertUnitType('eshd')) or IsUnitType(GetFilterUnit(), ConvertUnitType('uktg')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hjai')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Hvsh')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Ewar')) or IsUnitType(GetFilterUnit(), ConvertUnitType('Usyl'))) 
endfunction

function Go takes nothing returns nothing
   if i<=8 then
       call KillUnit(GetEnumUnit())... // твои действия над конкретным членом группы
     set i = i + 1 
   endif  
endfunction

function Actions takes real x, real y returns nothing
  local group g = CreateGroup()
  call GroupEnumUnitsInRange(g,x, y+192*i,100, Condition(function UnitType)) // 
  call ForGroup(g, function Go)
  set i = 1
  call DestroyGroup(g)
  set g = null
endfunction

Старый 09.02.2009, 14:14
Ответ

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

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

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

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



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