DK пишет:
Твой update можно сократить на несколько строк...
Да можно вообще в одну строчку записать, какая разница? Важно не количество строк, а количество производимых кодом действий.
Я стараюсь писать без побочных эффектов. Т.е. я специально пишу
timeBeforeRestoringTone--;
if (timeBeforeRestoringTone <= 0) {
а не:
if (--timeBeforeRestoringTone <= 0) {
Потому что по сути нагрузка на читател_ьницу не меняется: е_й по-прежнему придётся следить за двумя действиями (уменьшение переменной, сравнение).
Аналогично, можно в теории заменить две переменных одной: можно хранить иногда числовые значения, иногда булевые (допустим). Но нагрузка на чител_ьниц кода останется той же: им-по прежнему придётся следить за состоянием «затемнение нужно?» и «сколько ожидать осталось?»
DK пишет:
А если нужно изменять переменную каждый кадр, то твой setTimeout может промахнуться на несколько миллисекунд, что пойдет другой кадр.
Ну да. Я это признаю. (И сразу признавал. В моём первом ответе в этой теме уже сразу было указано.)
Однако в 99% случаев выгода от простоты кода неизмеримо больше, чем выгода от формальной точности. Поэтому setTimeout предпочтительнее.
Понятно, что в некоторых случаях (большие, сложные плагины с нетривиальной функциональностью) лучше использовать вариант с переписыванием update. Однако такие плагины пишутся редко, а простые на пару строк — часто.
____________________
Добавлено в 17:00:
Есть разные ситуации.
Если в скрипте «показать сообщение о новом квесте» некоторые сообщения будут показываться 5 секунд, а некоторые — 5,1 секунд, то разницу никто не заметит. Здесь достаточно setTimeout.
А если в ABS перепутается порядок действий и противник сначала умрёт, а потом нападёт, то это будет странно. В такой ситуации update может быть оправдано: важно, чтобы задержка перед действиями была точной.
И будем честны. Большинство скриптов, которые мы пишем, похожи на первый случай, а не на второй.