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

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

Закрытая тема
 
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
Jass Сократить объём записи
» Код:
function StopAnimationWork takes nothing returns nothing
    call SetUnitAnimation(GetEnumUnit(), "stand")
endfunction

function StopAnimation0 takes nothing returns nothing
    local timer t=GetExpiredTimer()
    call DestroyTimer(t)
    call ForGroup( udg_Rab1, function StopAnimationWork)
    set t=null
endfunction

function Trig_StopAnimationJ_Actions takes nothing returns nothing
local player p = GetOwningPlayer(GetTriggerUnit())
local timer t = CreateTimer()

    if p == Player(0) then
        call TimerStart(t, 0.40, false, function StopAnimation0 )
    endif
set p = null
set t = null
endfunction

//===========================================================================
function InitTrig_StopAnimationJ takes nothing returns nothing
    set gg_trg_StopAnimationJ = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(0), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(1), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(2), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(3), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(4), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(5), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(6), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(7), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerAddAction( gg_trg_StopAnimationJ, function Trig_StopAnimationJ_Actions )
endfunction
Возможно ли сократить запись (выполнение предоставлено только для одного первого игрока) => т.е.
по идее дублируется StopAnimation0 8 раз для каждого игрока + куча if`ов. (не прибегая к цжасс)
+ как внутри триггера объявить глобалку gg_trg_StopAnimationJ (создание триггера).
+ ещё вопрос, если выставлять блок глобалок в начале триггера, то при компиляции глобалки вынесутся в начало скрипта или каждый раз будут инициализироваться при работе триггера?
3 вопрос 1 тема :О
Старый 01.08.2010, 13:31
ScorpioT1000
Работаем
online
Опыт: отключен
udg_Rab1
это что?
если для каждого игрока своя группа, то массив групп делай, и так:
function StopAnimationWork takes nothing returns nothing
    call SetUnitAnimation(GetEnumUnit(), "stand")
endfunction

function StopAnimation takes nothing returns nothing
    local timer tm = GetExpiredTimer()
    local integer playerNum = R2I(TimerGetRemaining(tm)+0.5) //  ! get player index from timer
    call DestroyTimer()
    set tm = null
    call ForGroup( udg_Rab[playerNum], function StopAnimationWork) // !  udg_Rab [with player index]
endfunction

function Trig_StopAnimationJ_Actions takes nothing returns nothing
    local player p = GetOwningPlayer(GetTriggerUnit())
    local timer tm = CreateTimer()
    call TimerStart(tm, I2R(p), false, null) //  ! attach player index to timer
    call PauseTimer(tm)
    call TimerStart(tm, 0.40, false, function StopAnimation ) // start timer
    set p = null
    set tm = null
endfunction

//===========================================================================
function InitTrig_StopAnimationJ takes nothing returns nothing
    set gg_trg_StopAnimationJ = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(0), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(1), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(2), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(3), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(4), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(5), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(6), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(gg_trg_StopAnimationJ, Player(7), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerAddAction( gg_trg_StopAnimationJ, function Trig_StopAnimationJ_Actions )
endfunction
тут используется timer bug :)
Старый 01.08.2010, 13:40
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
сразу внутри цикла?
а где там цикл? если имеется в виду не делать отдельную функцию, то не получилось =)
udg_Rab1 это что?
группа у каждого игрока своя, по идее конечно стоило делать массив, это от древней моей кривости осталось.
код сейчас обмозгую =)
Старый 01.08.2010, 13:44
AlexKARASb
Learning cpp
offline
Опыт: 22,103
Активность:
function InitTrig_StopAnimationJ takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(1), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(2), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(3), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(4), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(5), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(6), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerRegisterPlayerUnitEvent(t, Player(7), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
    call TriggerAddAction( t, function Trig_StopAnimationJ_Actions )
    set t = null
endfunction
более изменять нет смысла, можно конечно сделать так
function InitTrig_StopAnimationJ takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    local integer i =0
	loop
	exitwhen i > 7
    call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_CONSTRUCT_START, null)
	set i = i + 1
	endloop
    call TriggerAddAction( t, function Trig_StopAnimationJ_Actions )
    set t = null
endfunction
Но логичнее первый вариант
Старый 01.08.2010, 13:54
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
call TimerStart(tm, I2R(p), false, null)
ругается, что игрока нельзя преобразовать в число, сделал так:
call TimerStart(tm, I2R(GetPlayerId(p)), false, null)
Не ясна сама механика действия бага таймеров, как так получается, что можно получить число таким образом?
Дополнительно не ясен этот момент:
local integer playerNum = R2I(TimerGetRemaining(tm)+0.5)
почему именно 0.5 и всегда ли он приведёт к безошибочным результатам?
AlexKARASb, спасибо, но всё же цикл, там где не нужен, будет лишним =)
vsparker добавил:
я Алиса в стране чудес =О
vsparker добавил:

кстати, почему нельзя из этого:
function StopAnimation takes nothing returns nothing
    local timer tm=GetExpiredTimer()
    call DestroyTimer(tm)
    set tm=null
    call ForGroup( udg_Rab[R2I(TimerGetRemaining(tm)+0.5)], function StopAnimationWork)
endfunction
сразу сделать так, без объявления локалки?
function StopAnimation takes nothing returns nothing
    local timer tm=GetExpiredTimer()
    call DestroyTimer(tm)
    set tm=null
    call ForGroup( udg_Rab[R2I(TimerGetRemaining(tm)+0.5)], function StopAnimationWork)
endfunction
эта связка массивы int +GetPlayerId(...) экономит чёртову тучу времени на написание, скорпи, дай поцелую =О.
Старый 01.08.2010, 14:50
ScorpioT1000
Работаем
online
Опыт: отключен
vsparker, он вместо реального времени в то поле данных таймера записывает другое, указанное нами, число, причем это не сбивает его счетчика)
а 0.5 прибавляется для точности, ибо float такой тип что может после присвоения к целому 1, после при обращении дать например 0.99999998, а после R2I получится 0, т.е. писали мы 1 а получили 0, вот для этого и +0.5
ScorpioT1002 добавил:
сразу сделать так, без объявления локалки?
она просто два раза юзается, там ниже же ещё
ScorpioT1002 добавил:
GetPlayerId(p)
это да, я забыл
ScorpioT1002 добавил:
vsparker, будь внимательнее, у тебя в твоем коде присваивается нулю раньше, чем ForGroup вызывается
Старый 01.08.2010, 14:58
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
ScorpioT1002, ясно, очень нужная штука.
последние простые вопросы:
+ как внутри триггера объявить глобалку gg_trg_StopAnimationJ (создание триггера). (проверка цепляется к объявлённым в других местах глобалках)
+ ещё вопрос, если выставлять блок глобалок в начале триггера, то при компиляции глобалки вынесутся в начало скрипта или каждый раз будут инициализироваться при работе триггера?
Старый 01.08.2010, 15:02
ScorpioT1000
Работаем
online
Опыт: отключен
глобалки всегда при загрузке карты создаются, все сразу (кроме ячеек массива). vjass позволяет объявлять в любом месте, но см начало предложения
Старый 01.08.2010, 15:05
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
хорошо. вот пожалуй последний вопрос, к тому триггеру прилагается дополнительный, где в ячейки массива записываются юниты, которые обновляются по ходу игры.
использовал гуй конверт + использовал новые знания от жасса (get id + массивы) и вот что получилось:
function Trig_PlayerGrJ_Func001001 takes nothing returns boolean
    return ( GetUnitTypeId(GetEnteringUnit()) == 'h01B' )
endfunction

function Trig_PlayerGrJ_Func001002 takes nothing returns boolean
    return ( GetUnitTypeId(GetEnteringUnit()) == 'h00C' )
endfunction

function Trig_PlayerGrJ_Conditions takes nothing returns boolean
    if ( not GetBooleanOr( Trig_PlayerGrJ_Func001001(), Trig_PlayerGrJ_Func001002() ) ) then
        return false
    endif
    return true
endfunction

function Trig_PlayerGrJ_Actions takes nothing returns nothing
local player p = GetOwningPlayer(GetTriggerUnit())
local integer PlayerNum = GetPlayerId(p)

call GroupAddUnit(udg_Rab[PlayerNum], GetTriggerUnit())

set p = null
endfunction

//===========================================================================
function InitTrig_PlayerGrJ takes nothing returns nothing
    set gg_trg_PlayerGrJ = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_PlayerGrJ, GetWorldBounds() )
    call TriggerAddCondition( gg_trg_PlayerGrJ, Condition( function Trig_PlayerGrJ_Conditions ) )
    call TriggerAddAction( gg_trg_PlayerGrJ, function Trig_PlayerGrJ_Actions )
endfunction

не ясно почему ругается на TriggerRegisterEnterRectSimple и GetBooleanOr (подсветка красным, как всех бж)
vsparker добавил:
+ видимо условия криво построены (гуи конверт)
vsparker добавил:
хмм ещё вопрос по поводу 1й конструкции, ведь получается в случае одновременной постройки несколькими игроками функция сработает только для одного? :О
Старый 01.08.2010, 15:45
Hellfim
Новичок
online
Опыт: 79,637
Активность:
function Trig_PlayerGrJ_Actions takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local integer typeId=GetUnitTypeId(u)
    if  typeId=='h00C' or typeId=='h01B' then
        call GroupAddUnit(udg_Rab[GetPlayerId(GetOwningPlayer(u))],u)
    endif
    set u=null
endfunction

//===========================================================================
function InitTrig_PlayerGrJ takes nothing returns nothing
    local region r=CreateRegion()
    set gg_trg_PlayerGrJ = CreateTrigger(  )
    call RegionAddRect(r,GetWorldBounds())
    call TriggerRegisterEnterRegion(gg_trg_PlayerGrJ,r,null)
    r=null
    call TriggerAddAction(gg_trg_PlayerGrJ,function Trig_PlayerGrJ_Actions)
endfunction
Старый 01.08.2010, 16:12
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
Hellfim, тут сразу всё ясно, спасибо.
по поводу того, что работа 1го триггера будет не "муи" то сделаю конструкцию более расширенную.
кстати, по сути можно обойтись одной глобалкой вместо использования таймер бага.
всем спасибо. вопросы решены.

Отредактировано vsparker, 01.08.2010 в 19:12.
Старый 01.08.2010, 19:05
Закрытая тема

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

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

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

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



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