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

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

Закрытая тема
 
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Переделать код так, чтобы для каждого случая был свой таймер
Вот мой код.
» Нестандартный код
Код:
function PlantStage takes integer stage returns integer
    if stage == 0 then
        return 'LTbs'
    elseif stage == 1 then
        return 'ITtg'
    elseif stage == 2 then
        return 'DTlv'
    elseif stage == 3 then
        return 'LTbx'
    endif
    return 'LTex'
endfunction

function WherePlant takes nothing returns integer
    return 100
endfunction

function TimePlant takes nothing returns real
    return 10.00
endfunction

function PlantGrowing takes nothing returns nothing
    local destructable plant = udg_plants[udg_i_plant]
    local integer stage = udg_plant_stage[udg_i_plant]
    local real x = GetDestructableX( plant )
    local real y = GetDestructableY( plant )
    call RemoveDestructable( plant )
    set stage = stage + 1
    set plant = CreateDestructable( PlantStage(stage), x, y, 0.00, 1.00, 1 )
    if stage == 3 then
        set udg_plants[udg_i_plant] = udg_plants[udg_num_of_plants - 1]
        set udg_plant_stage[udg_i_plant] = udg_plant_stage[udg_num_of_plants - 1]
        set udg_num_of_seeds[udg_i_plant] = udg_num_of_seeds[udg_num_of_plants - 1]
        set udg_num_of_plants = udg_num_of_plants - 1
        set udg_i_plant = udg_i_plant - 1
    else
        set udg_plants[udg_i_plant] = plant
        set udg_plant_stage[udg_i_plant] = stage
    endif
    set plant = null
endfunction

» Триггер PlantSeed
Код:
function Trig_PlantSeed_Conditions takes nothing returns boolean
    return GetItemTypeId(GetManipulatedItem()) ==  'I000'
endfunction

function Trig_PlantSeed_Actions takes nothing returns nothing
    local item i = GetManipulatedItem()
    local unit u = GetManipulatingUnit()
    local real dx = Cos(GetUnitFacing(u)*0.0174)*WherePlant()
    local real dy = Sin(GetUnitFacing(u)*0.0174)*WherePlant()
    set udg_plants[udg_num_of_plants] = CreateDestructable( PlantStage(0), GetUnitX(u)+dx, GetUnitY(u)+dy, 0.00, 1.00, 1 )
    set udg_plant_stage[udg_num_of_plants] = 0
    set udg_num_of_seeds[udg_num_of_plants] = GetItemCharges(i)+1
    set udg_plant_timer[udg_num_of_plants] = CreateTimer()
    set udg_num_of_plants = udg_num_of_plants + 1
    call RemoveItem(i)
    set i = null
endfunction

function InitTrig_PlantSeed takes nothing returns nothing
    set gg_trg_PlantSeed = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent( gg_trg_PlantSeed, GetLocalPlayer(), EVENT_PLAYER_UNIT_USE_ITEM, null)
    call TriggerAddCondition( gg_trg_PlantSeed, Condition( function Trig_PlantSeed_Conditions ) )
    call TriggerAddAction( gg_trg_PlantSeed, function Trig_PlantSeed_Actions )
endfunction

» Триггер Growing
Код:
function Trig_Growing_Conditions takes nothing returns boolean
    return udg_num_of_plants > 0
endfunction

function Trig_Growing_Actions takes nothing returns nothing
    set udg_i_plant = 0
    loop
        exitwhen udg_i_plant > ( udg_num_of_plants - 1 )
        call PlantGrowing()
        set udg_i_plant = udg_i_plant + 1
    endloop
endfunction

function InitTrig_Growing takes nothing returns nothing
    set gg_trg_Growing = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_Growing, TimePlant(), true)
    call TriggerAddCondition( gg_trg_Growing, Condition( function Trig_Growing_Conditions ) )
    call TriggerAddAction( gg_trg_Growing, function Trig_Growing_Actions )
endfunction


Его суть - PlantSeed отлавливает момент когда юнит использует предмет-семя, и "сажает" перед собой дерево-декорацию. Декорация, ее стадия (дерево растет этапами) и кол-во семян записываются в массивы.
В Growing каждые TimePlant() секунд в цикле через ф-ию PlantGrowing каждая декорация вырастает на 1 стадию.
Все стадии (модели-декорации) записаны в PlantStage.

Проблема в том, что TimePlant() используется с большими числами, т.е. 10, 20, 30 секунд, и возникает некрасивая ситуация - два "дерева" посаженные с промежутком в 10-15 секунд переходят на следующую стадию одновременно. Поэтому я хочу создать отдельный массив с таймерами для каждого дерева, но тогда не знаю как исправить условие срабатывания триггера Growing. Подскажите, как переделать код с наименьшими потерями?
Старый 18.07.2009, 05:33
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
заведи еще 1 переменную типа реал( или интежер ) в нее записывай время жизни для каждого дерева
Старый 18.07.2009, 08:28
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Не понимаю, как это можно использовать? Ведь Growing будет срабатывать в одно и то же время для каждого растения *SCRATCH*

JamesBlack добавил:
Все, доперло, решил задачу... правда немного не идеальное решение... Но ведь полсекунды разницы в данной задаче ни на что не повлияют?)))

Спасибо, тему можно закрыть.

Отредактировано ShadoW DaemoN, 18.07.2009 в 22:50.
Старый 18.07.2009, 21:56
Закрытая тема

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

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

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

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



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