Перейти к содержимому


Фотография

Как сделать задержку между выполнениями команд?


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 OFFLINE   Artpro

Artpro

    Рядовой

  • Пользователи
  • 3 сообщений

Отправлено 25 January 2015 - 02:28

Народ облазил все подряд, не как не могу понять.

Хочу чтоб диалог выдавался не сразу, а с промежутками.

Допустим пример, Делаю тригер в активации пишу unit1 sidechat "бла бла бла"; unit2 sidechat "бла бла бла"; я так понял что нужно сделать так 

unit1 sidechat "бла бла бла";

~5

unit2 sidechat "бла бла бла";

 

Но выдает ошибку "Неверное число в выражении"... Что не так?? 

Или как правильно сделать???


Сообщение отредактировал Artpro: 25 January 2015 - 02:36

  • 0

#2 OFFLINE   Afeallan

Afeallan

    Ефрейтор

  • Пользователи
  • 32 сообщений
  • Откуда:Москва

Отправлено 25 January 2015 - 04:41

Могу ошибаться, но "~" прописывается в .sqf-скриптах, и не срабатывает в инитах, активациях, и прочем. Но повторюсь, могу быть не прав.
  • 0

#3 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 сообщений

Отправлено 25 January 2015 - 11:28

Artpro, sleep 10; \\ Задержка 10 секунд 


  • 1

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 17:00

~5

Это выражение соответствует синтаксису в скриптах .sqs

 

Для .sqf, читаем пост выше.

 

В поле инициализации sleep не работает, реализация выглядит подобным образом

0 = [] spawn {
    sleep 5;

    // дальнейший код
};

Сообщение отредактировал SteelRat: 25 January 2015 - 17:05

  • 2

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 25 January 2015 - 17:13

uiSleep 5;


  • 0

#6 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 сообщений

Отправлено 25 January 2015 - 17:42

SteelRat, О как я на мелочи прокололся))) 


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 25 January 2015 - 19:02

uiSleep 5;

Плохая идея использовать команды для графического интерфейса, в инициализации объектов.


  • 2

#8 OFFLINE   Artpro

Artpro

    Рядовой

  • Пользователи
  • 3 сообщений

Отправлено 25 January 2015 - 21:50

Понял, Огромное спасибо.


  • 0

#9 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 26 January 2015 - 09:30

 

uiSleep 5;

Плохая идея использовать команды для графического интерфейса, в инициализации объектов.

 

Единственное отличие, между sleep и uisleep это то, что uisleep основан на SystemTime, а sleep, на итерациях каденсеров - симуляторах естественного времени в игре.

sleep может тупо застрять и сделать паузу некорректной, т.к. задержка будет основана на общей производительности системы в игре.

uisleep не застрянет, а четко отсчитав интервал времени, продолжит выполнение.

 

Для четких пауз в простых скриптах, которые не зависят от окружения, лучше uisleep, а для тяжелых скриптов, использовать булевы переменные, и после этого ставить задержки.

 

Пример прост:

Предположительный скрипт - персонаж выполняет ряд действий. В идеале весь скрипт должен отработать за 35сек.

При этом через 15 секунд должна быть пауза в 5 секунд, затем вторая часть действий.

Представим, что первые 15 секунд из-за загруженности системы и просадки производительности были выполнены за 20 - т.е. прирост в ~1\4, команда sleep 5; будет выполняться не 5 секунд, а 5+5\4. Тогда как uiSleep отсчитает четкий интервал в 5 сек.

В целом, все зависит от того, какой результат должен быть на экране - плавный и равномерный(если скрипт визуализирует что либо), и пауза должна быть основана на общей скорости скрипта в целом. В другом случае, это технический скрипт, в котором задержка должна быть основана на системном времени, и до визуализации нет никакого дела.


Сообщение отредактировал NoNameUltima: 26 January 2015 - 09:42

  • 1

#10 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 26 January 2015 - 11:03

NoNameUltima, но ему кокрастаки и нужно зависящее о грового времени задержка! Т к он собирается выводить диалог/монолог - а с твоей командой при ускорении 4х или тормозах можно накосячить и слова будут не соответствовать действительности

Сообщение отредактировал vlad333000: 26 January 2015 - 11:04

  • 0

#11 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 26 January 2015 - 11:32

NoNameUltima, но ему кокрастаки и нужно зависящее о грового времени задержка! Т к он собирается выводить диалог/монолог - а с твоей командой при ускорении 4х или тормозах можно накосячить и слова будут не соответствовать действительности

я же говорю - зависит от анимации.

Представь - стоят два юнита и трындят.

Между диалогом пауза 5 сек.

Какой смысл делать ее больше, основываясь на скорости игры?

Другое дело, если после какого то диалога, подъезжает тачка, из нее выходит юнит и что то говорит.(это просто, как пример).

Тут конечно может произойти рассинхрон - диалог может начаться раньше, чем юнит выйдет из техники.

Все от условий задачи зависит.

 

P.S.

Вот пример, мб дурацкий, но простой -

1 Юнит 1 что то говорит

2 Вызов скрипта spawn (в данном скрипте едет тачка от точки А до точки Б)

3 юнит 2 что то говорит

4 пауза ххх

5 Юнит 2 что то говорит.

6 (тачка должна приехала) Юнит 1 что то говорит.

 

 

Как я и писал выше, - правильней использовать булевы переменные -

Вместо строки 6 -

waitUntil {ждем пока скрипт 2 выполнится}; Юнит 1 что то говорит

а в 4 строке можно использовать uiSleep, для чОткой паузы, вместо расчетов и подгонок, под исполнение скрипта из строки 2.


Сообщение отредактировал NoNameUltima: 26 January 2015 - 11:39

  • 0

#12 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 26 January 2015 - 15:12

NoNameUltima, кнопка + и весь ваш скрипт при использовании uiSleep рушится: не синхронизировано и не так как ты хочешь, да к тому же сами BIS'ы используют простой sleep почти везде - незачем заного изобретать колесо и придымувыть себе сложности!

Сообщение отредактировал vlad333000: 26 January 2015 - 15:13

  • 0

#13 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 26 January 2015 - 16:14

NoNameUltima, кнопка + и весь ваш скрипт при использовании uiSleep рушится: не синхронизировано и не так как ты хочешь, да к тому же сами BIS'ы используют простой sleep почти везде - незачем заного изобретать колесо и придымувыть себе сложности!

А в MP, я вот смотрю наоборот однако.

 

P.S. Да мне в принципе все равно, - делайте как хотите.


Сообщение отредактировал NoNameUltima: 26 January 2015 - 16:15

  • 0

#14 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 26 January 2015 - 20:45

 

 

uiSleep 5;

Плохая идея использовать команды для графического интерфейса, в инициализации объектов.

 

Единственное отличие, между sleep и uisleep это то, что uisleep основан на SystemTime, а sleep, на итерациях каденсеров - симуляторах естественного времени в игре.

sleep может тупо застрять и сделать паузу некорректной, т.к. задержка будет основана на общей производительности системы в игре.

uisleep не застрянет, а четко отсчитав интервал времени, продолжит выполнение.

 

Для четких пауз в простых скриптах, которые не зависят от окружения, лучше uisleep, а для тяжелых скриптов, использовать булевы переменные, и после этого ставить задержки.

 

Пример прост:

Предположительный скрипт - персонаж выполняет ряд действий. В идеале весь скрипт должен отработать за 35сек.

При этом через 15 секунд должна быть пауза в 5 секунд, затем вторая часть действий.

Представим, что первые 15 секунд из-за загруженности системы и просадки производительности были выполнены за 20 - т.е. прирост в ~1\4, команда sleep 5; будет выполняться не 5 секунд, а 5+5\4. Тогда как uiSleep отсчитает четкий интервал в 5 сек.

В целом, все зависит от того, какой результат должен быть на экране - плавный и равномерный(если скрипт визуализирует что либо), и пауза должна быть основана на общей скорости скрипта в целом. В другом случае, это технический скрипт, в котором задержка должна быть основана на системном времени, и до визуализации нет никакого дела.

 

 

Тут суть в принципе в другом, дело в том что применять команду приостановки, не важно какую именно, в поле инита объекта не даст тот функционал, который инициализирует модуль, я именно об этом.

 

И если мне не изменяет память, функционал инициализирующий модуль, исполняет то что в поле инициализации методом

call {};

а при таком раскладе явное применение команд приостановки в поле инициализации не приемлемо.


  • 0

#15 OFFLINE   Artpro

Artpro

    Рядовой

  • Пользователи
  • 3 сообщений

Отправлено 26 January 2015 - 21:26

А может подскажете еще, Делаю такой скрипт.

 

0 = [] spawn {p1 sidechat "..........";

sleep 10;
p2 sidechat ".........." };

Вызываю его командой.

 

script = [] ExecVM ".....sqf"

И скрипт становится цикличным (т.е. После последнего выполняется первое) 

Также нашел команду. 

 

 

variable = [boolean] ExecVM "scrip.sqf"

При ее использовании все нормально. 

И вопрос, если брать допустим диалог, то к каждому тригеру нужно писать отдельный скрипт, или можно все засунуть в один? Но так чтоб в один момент выдавал одно действие а при другом тригере другое? или где это можно почитать. потому что здесь 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 и здесь 

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

, я ничего не нашел.


  • 0

#16 OFFLINE   Djon

Djon

    Старшина

  • Пользователи
  • 433 сообщений

Отправлено 26 January 2015 - 22:03

Artpro, Можете что угодно запихать в один файл, если вы об этом. Просто нужно скрипт поделить на области. То есть

_oblast1 = _this;
switch _oblast1 do 
    {

         case "_oblast_1" : 
        { Код	   
	    };
	  
         case "_oblast_2" : 
        { Код второй области
            };
		
	};	 

Запускаете так

_hndl = "_oblast_1" execVM "skript.sqf";

или другую область

_hndl = "_oblast_2" execVM "skript.sqf";

По поводу того как зациклить скрипт, так ни чего вам не мешает в конце скрипта поставить нужную вам задержку и запустить самого себя снова

P.S. так то для этого существуют циклы и если вам интересно то  тут можно прочитать как они работают


Сообщение отредактировал Djon: 26 January 2015 - 22:07

  • 0

#17 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 27 January 2015 - 18:13

NoNameUltima, кнопка + и весь ваш скрипт при использовании uiSleep рушится: не синхронизировано и не так как ты хочешь, да к тому же сами BIS'ы используют простой sleep почти везде - незачем заного изобретать колесо и придымувыть себе сложности!

Ах да, еще забыл, -

т.е., что в SP, что в МР, у одного голод будет наступать через полтора часа(голод к примеру привел, - и плевать, кто там лагает\тормозит и т.п. - инкрементация значения должна происходить строго по SystemTime), потому что он видите ли, слегка притормаживает) А у другого через 30 минут, потому что он "летает"?)

BIS'ам конечно оно виднее) А в API, uiSleep они от нечего делать ввели....


  • 0




Яндекс.Метрика