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

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

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

offline
Опыт: 11,197
Активность:
Про локальные переменные
Мну нужно объявить локальную переменную чтобы она являлась условием
» Вот код:
Код:
function Trig_AttackedPig_Func002C takes nothing returns boolean
    if ( not ( attackchanse == 1 ) ) then
        return false
    endif
    return true
endfunction

function Trig_AttackedPig_Actions takes nothing returns nothing        
set attackchanse = GetRandomInt(0, 1)      
if ( Trig_AttackedPig_Func002C() ) then      
// Сдесь делать что-то      
else      
endif  
endfunction

function InitTrig_AttackedPig takes nothing returns nothing
    
    set gg_trg_AttackedPig = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_AttackedPig, 1.00 )
    call TriggerAddAction( gg_trg_AttackedPig, function Trig_AttackedPig_Actions )
endfunction

Где нужно объявлять переменную "attackchanse", чтобы она была и в Trig_AttackedPig_Actions, и в Trig_AttackedPig_Func002C?
Или это невозможно и надо использовать глобальные переменные?
Старый 07.11.2008, 17:58
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
для начала хорошо бы почитать статьи по жасс и убрать идиотские гуишные условия отдельными функциями, после чего все станет отлично и понятно
Старый 07.11.2008, 18:03
agentex

offline
Опыт: 34,834
Активность:
вообщето в глобалз но не в твоем случае.
Цитата:
function Trig_AttackedPig_Func002C takes nothing returns boolean
if ( not ( attackchanse == 1 ) ) then
return false
endif
return true
endfunction

ну во первых так:
Код:
function Trig_AttackedPig_Func002C takes nothing returns boolean
    return attackchanse == 1
endfunction

да и у тя все както не как у людей зачем булэкспр тут нужен то?
Код:
function Trig_AttackedPig_Func001A takes nothing returns nothing        
set attackchanse = GetRandomInt(0, 1)      
if attackchanse == 1 then
// Сдесь делать что-то
endif
endfunction
Старый 07.11.2008, 18:03
RazArt

offline
Опыт: 11,197
Активность:
Просто только недавно начал учиться жассу и поэтому не знал что можно всё записать 1 функцией
Старый 07.11.2008, 18:04
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
и вообще здесь не нужна локалка
Код:
if GetRandomInt(0,1)==1 then
//блаблабла
endif
Старый 07.11.2008, 18:05
agentex

offline
Опыт: 34,834
Активность:
вообще говоря не все. например когда собираешь юнитов в группу GroupEnumUnits там нужно в качестве последнего аругмента указывать именно функцию-критерий по которой юудет вестись отбор. (хотя обычно ставят null и проходятся по группе циклом)
Старый 07.11.2008, 18:06
RazArt

offline
Опыт: 11,197
Активность:
А как можно заменить несколько условий

» Вот полный код:

Код:
function Trig_AttackedPig_Func001Func001002003001001 takes nothing returns boolean
    return ( IsUnitDeadBJ(GetFilterUnit()) == false )
endfunction

function Trig_AttackedPig_Func001Func001002003001002 takes nothing returns boolean
    return ( GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE) )
endfunction

function Trig_AttackedPig_Func001Func001002003001 takes nothing returns boolean
    return GetBooleanAnd( Trig_AttackedPig_Func001Func001002003001001(), Trig_AttackedPig_Func001Func001002003001002() )
endfunction

function Trig_AttackedPig_Func001Func001002003002 takes nothing returns boolean
    return ( GetUnitTypeId(GetFilterUnit()) == 'n000' )
endfunction

function Trig_AttackedPig_Func001Func001002003 takes nothing returns boolean
    return GetBooleanAnd( Trig_AttackedPig_Func001Func001002003001(), Trig_AttackedPig_Func001Func001002003002() )
endfunction

function Trig_AttackedPig_Func001Func002C takes nothing returns boolean
    if ( not ( IsUnitGroupEmptyBJ(udg_PigAttackedGroup) == false ) ) then
        return false
    endif
    return true
endfunction

function Trig_AttackedPig_Func001A takes nothing returns nothing
    local unit pig
    local integer attackchanse
    set udg_PigAttackedGroup = GetUnitsInRangeOfLocMatching(250.00, GetUnitLoc(GetEnumUnit()), Condition(function Trig_AttackedPig_Func001Func001002003))
    set pig = GroupPickRandomUnit(udg_PigAttackedGroup)
    set attackchanse = GetRandomInt(0, 1)      
    if attackchanse == 1 then
    if ( Trig_AttackedPig_Func001Func002C() ) then
        call IssueTargetOrderBJ( GetEnumUnit(), "attack", pig )
        call IssueTargetOrderBJ(pig, "attack", GetEnumUnit() )
    else
    endif
    else
    endif
endfunction

function Trig_AttackedPig_Actions takes nothing returns nothing
    call ForGroupBJ( udg_MedvedGroup, function Trig_AttackedPig_Func001A )
endfunction

//===========================================================================
function InitTrig_AttackedPig takes nothing returns nothing
    
    set gg_trg_AttackedPig = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_AttackedPig, 1.00 )
    call TriggerAddAction( gg_trg_AttackedPig, function Trig_AttackedPig_Actions )
endfunction


Или лучше оставить так?
Старый 07.11.2008, 18:15
RazArt

offline
Опыт: 11,197
Активность:
Ну так как несколько условий в 1 объединить, не через запятую же) или там есть "And" или "Or"?
Старый 07.11.2008, 18:22
agentex

offline
Опыт: 34,834
Активность:
и and и or там есть...

udg_MedvedGroup
:D
Старый 07.11.2008, 18:23
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Ну последовательно ищешь вызовы функций и заменяешь на их внутренности, приведенные до этого к человеческому виду.
Старый 07.11.2008, 18:24
RazArt

offline
Опыт: 11,197
Активность:
Вот я попытался сделать 1 строкой, у меня теперь выдаёт 2 ошибки

» Вот полный код:

Код:
function Trig_AttackedPig_Func001A takes nothing returns nothing
    local unit pig
    set udg_PigAttackedGroup = GetUnitsInRangeOfLocMatching(250.00, GetUnitLoc(GetEnumUnit()), Condition( GetBooleanAnd ( GetBooleanAnd( IsUnitDeadBJ(GetFilterUnit()) == false, GetOwningPlayer(GetFilterUnit()) == Player(PLAYER_NEUTRAL_AGGRESSIVE)), GetUnitTypeId(GetFilterUnit()) == 'n000' )))
    set pig = GroupPickRandomUnit(udg_PigAttackedGroup)
    if GetRandomInt(0, 1)==1 then
    if ( IsUnitGroupEmptyBJ(udg_PigAttackedGroup) == false ) then
        call IssueTargetOrderBJ( GetEnumUnit(), "attack", pig )
        call IssueTargetOrderBJ(pig, "attack", GetEnumUnit() )
    else
    endif
    else
    endif
endfunction

function Trig_AttackedPig_Actions takes nothing returns nothing
    call ForGroupBJ( udg_MedvedGroup, Trig_AttackedPig_Func001A )
endfunction

function InitTrig_AttackedPig takes nothing returns nothing
    set gg_trg_AttackedPig = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_AttackedPig, 1.00 )
    call TriggerAddAction( gg_trg_AttackedPig, function Trig_AttackedPig_Actions )
endfunction


Он пишет что неверный тип аргумента (boolean)

JokArt добавил:
Все спасибо Van Damm'у и agentex'у за помошь, я разобрался, тему можно закрывать

Отредактировано JokArt, 07.11.2008 в 18:56.
Старый 07.11.2008, 19:17
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Выносить все в одну строку там не нужно, делай нужные сравнения в отдельной функции и пиши Condition(function MyFunc).
» 12345
Как по-хорошему должен выглядеть твой код:
Код:
function AttackedPig_Condition takes nothing returns boolean
  if GetWidgetLife(GetFilterUnit()) > .405 and GetOwningPlayer(GetFilterUnit()) == Player(12) and GetUnitTypeId(GetFilterUnit()) == 'n000' then
    set udg_i = udg_i + 1
    if GetRandomInt(1, udg_i) == 1 then
      set udg_pig = GetFilterUnit()
    endif
  endif
  return false
endfunction

function AttackedPig_Callback takes nothing returns nothing
  call GroupEnumUnitsInRange(udg_PigAttackedGroup, GetUnitX(GetEnumUnit()), GetUnitY(GetEnumUnit()), 250., Condition(function AttackedPig_Condition))
  if GetRandomInt(0, 1) == 1 and udg_pig != null then
    call IssueTargetOrderById(GetEnumUnit(), 851983, udg_pig)
    call IssueTargetOrderById(udg_pig, 851983, GetEnumUnit())
  endif
endfunction

function AttackedPig_Actions takes nothing returns nothing
  call ForGroup(udg_MedvedGroup, function AttackedPig_Callback)
endfunction

//===========================================================================
function InitTrig_AttackedPig takes nothing returns nothing
  call TimerStart(CreateTimer(), 1., true, function AttackedPig_Actions)
endfunction

Автору настоятельно рекомендую изучить Jass-библиотеку.
Старый 07.11.2008, 19:18
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
if GetWidgetLife(GetFilterUnit()) > .405 and GetOwningPlayer(GetFilterUnit()) == Player(12) and GetUnitTypeId(GetFilterUnit()) == 'n000' then

утечки фильтер юнита, насколько мне известно
Старый 08.11.2008, 10:24
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
ScorpioT1000, если значение функции GetFilterUnit() не заносится в переменную, то утечки нет. Можно, конечно, написать так:
Код:
function AttackedPig_Condition takes nothing returns boolean
  local unit u = GetFilterUnit()
  if GetWidgetLife(u) > .405 and GetOwningPlayer(u) == Player(12) and GetUnitTypeId(u) == 'n000' then
    set udg_i = udg_i + 1
    if GetRandomInt(1, udg_i) == 1 then
      set udg_pig = u
    endif
  endif
  set u = null
  return false
endfunction

Но мне первый вариант нравится больше.
Старый 08.11.2008, 12:55
ScorpioT1000
Работаем
offline
Опыт: отключен
так он когда передает он должен что-то передавать,т.е. во время передачи он вызывает GetFilterUnit, который возвращает юнита, который передается уже туда..
ну хотя да, все норм =)
Старый 08.11.2008, 14:17
Закрытая тема

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

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

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

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



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