Сейчас я работаю над проектом TimeRun и здесь я хотел бы поделиться/рассказать о том как сделать "секундомер". Идея проста: начинается отсчёт времени, далее запускается секундомер, когда игрок прибегает в зону, секундомер останавливаеться и показывается время плавающим текстом. Внизу будет ссылка на карту-пример.
Итак, заготовка переменных. Создаём переменную Time типа Реальная Создаём переменную FloatingTexts типа Плавающий текстс массивом 4.
Ну и всё.
Создание Создаём триггер "Beginning":
События: Time Elapsed 0.01 seconds Условия. Действия: Пауза (Все юниты) Создать плавающий текст "5" размером 30 с Z смещением 0 в точке (Текущее расположение камеры) цветом (100%,90%,0%) Установить FloatingTexts[0] = Последний созданный плавающий текст Set the velocity FloatingTexts[0] to 64.00 and 90.00 degrees. Wait 1.00 seconds Создать плавающий текст "4" размером 30 с Z смещением 0 в точке (Текущее расположение камеры) цветом (100%,90%,0%) Установить FloatingTexts[1] = Последний созданный плавающий текст Set the velocity FloatingTexts[1] to 64.00 and 270.00 degrees. Wait 1.00 seconds Создать плавающий текст "3" размером 30 с Z смещением 0 в точке (Текущее расположение камеры) цветом (100%,90%,0%) Установить FloatingTexts[2] = Последний созданный плавающий текст Set the velocity FloatingTexts[2] to 64.00 and 180.00 degrees. Wait 1.00 seconds Создать плавающий текст "2" размером 30 с Z смещением 0 в точке (Текущее расположение камеры) цветом (100%,90%,0%) Установить FloatingTexts[3] = Последний созданный плавающий текст Set the velocity FloatingTexts[3] to 64.00 and 0.00 degrees. Wait 1.00 seconds Создать плавающий текст "1" размером 30 с Z смещением 0 в точке (Текущее расположение камеры) цветом (100%,90%,0%) Установить FloatingTexts[4] = Последний созданный плавающий текст Wait 1.00 seconds Продолжить (Все юниты) Включить триггер TimePlus Включить триггер MultiboardTimePlus Wait 0.02 seconds Уничтожить FloatingTexts[0] Уничтожить FloatingTexts[1] Уничтожить FloatingTexts[2] Уничтожить FloatingTexts[3] Уничтожить FloatingTexts[4]
Таким образом у нас остановятся все юниты, все цифры будут золотоми, цифра 5 пойдёт вверх, цифра 4 вниз, цифра 3 вправо, цифра 2 влево, цифра 1 останется по центру. Потом включится "секундомер", с юнитов уберётся пауза, цифры удалятся. Теперь создадим триггер "Time":
События: Elapsed game time is 0.01 seconds Условия. Действия: Custom Script: set udg_Time=0.001
Это мы установили начало "секундомера"
Теперь создадим триггер "TimePlus" поставим изначально вылючен: Теперь переведём его в Jass (Правка -> Конвертировать в текст) и всё что там заменим на:
Code
function Trig_TimePlus_Actions takes nothing returns nothing set udg_Time=(udg_Time+0.001) endfunction
function InitTrig_TimePlus takes nothing returns nothing set gg_trg_TimePlus = CreateTrigger() call TriggerRegisterTimerEventPeriodic(gg_trg_TimePlus,0.001 ) call TriggerAddAction(gg_trg_TimePlus,function Trig_TimePlus_Actions) endfunction
Теперь создадим триггер "Multiboard":
События: Elapsed game time is 5.00 seconds Условия. Действия: Меню паузы - Создать меню паузы с 1 столбцом и 1 строчкой Меню паузы - Развернуть последнее созданное меню паузы Меню паузы - Установить размер 1 столбца и 1 строчки к 5.00%
И создадим триггер "MultiboardTimePlus" c параметром изначально выключен: Конвертируем его в Jass, и всё что там меняем на:
Code
function Trig_MultiboardTimePlus_Actions takes nothing returns nothing call MultiboardSetItemValueBJ(GetLastCreatedMultiboard(),1,1,R2S(udg_Time)) endfunction
function InitTrig_MultiboardTimePlus takes nothing returns nothing set gg_trg_MultiboardTimePlus= CreateTrigger() call TriggerRegisterTimerEventPeriodic( gg_trg_MultiboardTimePlus, 0.001 ) call TriggerAddAction( gg_trg_MultiboardTimePlus, function Trig_MultiboardTimePlus_Actions) endfunction
Теперь создадим "конец", создадим триггер "TheEnd":
События: Юнит входит в область Конец Условия. Действия: Выключить триггер TimePlus Выключить триггер MultiboardTimePlus Вывести на экран сообщение String(Time) (Convert Real To String) Пауза (Все юниты)
Вот более упрощённая версия: Нужно удалить триггер MultiboardTimePlus, а всё что в триггере TimePlus заменить на:
Code
function Trig_TimePlus_Actions takes nothing returns nothing set udg_Time=(udg_Time+0.001) call MultiboardSetItemValue(mb, R2S(udg_Time)) call MultiboardReleaseItem(mb) set mb = null endfunction
function InitTrig_TimePlus takes nothing returns nothing set gg_trg_TimePlus = CreateTrigger() call TriggerRegisterTimerEventPeriodic(gg_trg_TimePlus,0.001 ) call TriggerAddAction(gg_trg_TimePlus,function Trig_TimePlus_Actions) endfunction
Dreii, а какой вызов отвечает за Меню паузы - Изменить текст в 1 столбце и 1 строчке ? Я убирал BJ, а он пишет, недостаточно аргументов. SirNikolas, лагать не будет, всё норм, 0.01 недостаточно,так как сразу десятые прибавляются, а мне нужны тысячные!
local multiboarditem mb = MultiboardGetItem(bj_lastCreatedMultiboard, 0, 0) call MultiboardSetItemValue(mb, R2S(udg_Time)) call MultiboardReleaseItem(mb) set mb = null
Quote (romaN-1998)
сразу десятые прибавляются, а мне нужны тысячные!
Во-первых, не десятые, а сотые, а ты про то, что показывается число с тремя знаками после запятой, то что мешает тебе убрать третий с помощью подстроки?
Чем, ну к примеру тем что 70% функций создают утечки, и более того они дико медленные.
Бж функции состоят из нативных(native) функций, и очень часто Бж функции дублируют нативки, казалось бы разницы нету, но на деле все совершенно не так, т.к. при использовании БЖ происходит вызов дополнительной функциии.
Вызов дополнительной функции = дополнительное процессорное время на обработку.
К примеру функция БЖ которая создает таймер, вызывает функцию нативную которая отвечает за создание таймера, и тут вопрос, а нафиг?
Можно сразу вызвать нативную функцию напряму и сэкономить процессорное время.
О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас. My Project: Nindogatari MAL
Dreii, зачем? К нему мы обращаемся по ходу всей игры, если ты про глобалку. А если про локалку, то да, нуждается, но я не пойму, зачем тебе понадобилось делать локальную доску.