Сейчас 03:47:46 Пятница, 20 сентября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Статья]Простейший таймер
romaN-1998Дата: Вторник, 01 Февраля 2011, 01:49:59 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1368
Награды: 0
Репутация: 10
Блокировки:
Сейчас я работаю над проектом 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)
Пауза (Все юниты)

Карта-пример: Multiboard - Секундомер

Сообщение отредактировал romaN-1998 - Вторник, 01 Февраля 2011, 16:29:20
 

[stebashka]Дата: Вторник, 01 Февраля 2011, 05:28:41 | Сообщение # 2
пути и нити разными бывают
Группа: Библиотекари
Сообщений: 4719
Награды: 5
Блокировки:
Quote (romaN-1998)
Wait 1.00 seconds

это не совсем точное действие, он срабатывает не через 1 чек, делай таймерами


 

DreiiДата: Вторник, 01 Февраля 2011, 10:48:18 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
romaN-1998, если пишешь на жасс то сделай нормальный код. И еще плавающий текст ужасен. Я выкладывал кое готового текста:)юзай его

 

romaN-1998Дата: Вторник, 01 Февраля 2011, 13:00:57 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 1368
Награды: 0
Репутация: 10
Блокировки:
Dreii, а что с кодом ?
 

SirNikolasДата: Вторник, 01 Февраля 2011, 13:25:37 | Сообщение # 5
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
romaN-1998, таймер на .001 будет ужасно тормозить компьютер, тем более - два таких таймера. .01 на GUI вполне хватит.

 

DreiiДата: Вторник, 01 Февраля 2011, 13:41:30 | Сообщение # 6
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
romaN-1998, BJ- а бж гавно

 

romaN-1998Дата: Вторник, 01 Февраля 2011, 14:11:18 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1368
Награды: 0
Репутация: 10
Блокировки:
Dreii, а какой вызов отвечает за Меню паузы - Изменить текст в 1 столбце и 1 строчке ? Я убирал BJ, а он пишет, недостаточно аргументов.
SirNikolas, лагать не будет, всё норм, 0.01 недостаточно,так как сразу десятые прибавляются, а мне нужны тысячные!

Добавлено (01-02-2011, 14:11)
---------------------------------------------
-Лучше выглядит.

А чем BJ - гавно?

 

SirNikolasДата: Вторник, 01 Февраля 2011, 14:16:36 | Сообщение # 8
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Code
local multiboarditem mb = MultiboardGetItem(bj_lastCreatedMultiboard, 0, 0)
call MultiboardSetItemValue(mb, R2S(udg_Time))
call MultiboardReleaseItem(mb)
set mb = null
Quote (romaN-1998)
сразу десятые прибавляются, а мне нужны тысячные!
Во-первых, не десятые, а сотые, а ты про то, что показывается число с тремя знаками после запятой, то что мешает тебе убрать третий с помощью подстроки?


 

romaN-1998Дата: Вторник, 01 Февраля 2011, 14:44:03 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1368
Награды: 0
Репутация: 10
Блокировки:
SirNikolas, зачем обнулять мульибоард ?
 

DreiiДата: Вторник, 01 Февраля 2011, 14:58:47 | Сообщение # 10
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
romaN-1998, Нужно обнулять все то чо имеет хендлы

 

FaionДата: Вторник, 01 Февраля 2011, 15:26:48 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (romaN-1998)
А чем BJ - гавно?

Чем, ну к примеру тем что 70% функций создают утечки, и более того они дико медленные.

Бж функции состоят из нативных(native) функций, и очень часто Бж функции дублируют нативки, казалось бы разницы нету, но на деле все совершенно не так, т.к. при использовании БЖ происходит вызов дополнительной функциии.

Вызов дополнительной функции = дополнительное процессорное время на обработку.

К примеру функция БЖ которая создает таймер, вызывает функцию нативную которая отвечает за создание таймера, и тут вопрос, а нафиг?

Можно сразу вызвать нативную функцию напряму и сэкономить процессорное время.


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

romaN-1998Дата: Вторник, 01 Февраля 2011, 16:31:18 | Сообщение # 12
10 уровень
Группа: Проверенные
Сообщений: 1368
Награды: 0
Репутация: 10
Блокировки:
Quote (SirNikolas)
local multiboarditem mb = MultiboardGetItem(bj_lastCreatedMultiboard, 0, 0

SirNikolas, а где значения 0,0 разве не 1,1 должно быть ??
 

SirNikolasДата: Вторник, 01 Февраля 2011, 17:18:38 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (romaN-1998)
SirNikolas, зачем обнулять мульибоард?
romaN-1998, если бы ты был внимателен, то заметил бы, что это не мультибоард, а его ячейка.
Quote (romaN-1998)
а где значения 0,0 разве не 1,1 должно быть?
В JASS практически все нумеруется с нуля. Причем здесь сначала ставится номер ряда, а затем номер колонки, а не наоборот.


 

DreiiДата: Вторник, 01 Февраля 2011, 17:19:23 | Сообщение # 14
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, А мультиборд разве не нуждается в обнулении?

 

SirNikolasДата: Вторник, 01 Февраля 2011, 17:21:50 | Сообщение # 15
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Dreii, зачем? К нему мы обращаемся по ходу всей игры, если ты про глобалку. А если про локалку, то да, нуждается, но я не пойму, зачем тебе понадобилось делать локальную доску.

 

DreiiДата: Вторник, 01 Февраля 2011, 17:25:20 | Сообщение # 16
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
SirNikolas, ммм ну не знаю,но я зачем-то обнулял глобалку мб^^

 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz