От нечего делать, с целью развлечения и избавления от стресса, я открываю проект "Антистресс" от 1С.
Я решил написать игру - очередной "Тетрис". Но это слишком просто, нет вызова. Поэтому я решил поэкспериментировать.
Во-первых, я вспомнил фильм "Матрица", эффект с цифровым зеленым дождем в заставке, и решил сделать визуал в таком же стиле. Пусть тетрамины падают в виде зеленых блоков с буквами и оставляют затухающий след.
Во-вторых, в процессе пришла идея: пусть упавшие в кучу фигуры тоже затухают. Чтобы усложнить игру, когда тетрамин падает, не видно, куда его направлять. Вся куча подсвечивается только в момент приземления и постепенно гаснет. До следующего приземления фигуры приходится запоминать положение блоков.
Геймплей: https://rutube.ru/video/8cb7ef66a237ede6f4d51cd60c3a7f72/
Единственная существенная трудность, с которой я столкнулся: 1С не позволяет интерактивно взаимодействовать с формой, пока выполняется код этой самой формы. Штатное средство (насколько я понимаю, если не изобретаю велосипед) только одно - подключение обработчиков ожидания. В принципе, вариант неплохой, но есть нюанс: повторяемый обработчик вызывается с шагом, кратным целой секунде. Это очень много, ни о какой комфортной игре речи нет. Неповторяемый можно вызвать через 0,1 секунды, то есть FPS будет равен 10. Тоже очень плохо.
Мало того, платформа не гарантирует вызов даже за это время. Мои тесты показали, что в лучшем случае вызов происходит через 0,2 секунды. И никакие "танцы с бубном" вроде дублирования вызовов не помогают. Тупик? Нет, есть "костыль".
Можно создать поле HTML на форме и разместить в нем JavaScript, который по своему таймеру будет нажимать невидимую кнопку в самом же поле HTML. Это нажатие перехватывается платформой. Так тоже не достичь запредельного FPS, но 30 вызовов в секунду вполне работают. С этим уже можно жить.
Теперь нужно четко отработать тайм-менеджмент. Даже тайм-микро-менеджмент )) Отслеживать, вовремя ли произошел вызов и не слишком ли много времени затрачено на вывод картинки. Возможно, стоит не рисовать текущий кадр, а сразу переходить к следующему - пусть лучше один кадр выпадет, чем возникнут неприятные лаги. Интерпретатор 1С не слишком шустрый, так что времени на отрисовку не так много. Можно было бы часть логики запрятать в JavaScript? Можно, но зачем? )) Зачем тогда 1С? В JS я оставил только таймер, а всю игровую логику организовал на стороне 1С.
Также выяснилось, что существуют официальные правила и стандарты "Тетриса", которым я постарался следовать, хоть мой порт и неофициальный. Там есть хитрая система "супервращения" (SRS). Это когда фигура "отскакивает" от стенки при повороте или ее можно "ввернуть" в определенное место поля, куда она не смогла бы попасть естественным путем. Это называется T-spin.
Все это я попытался реализовать. Единственное - за T-spin обычно начисляются особые бонусные очки, но с этим я уже не стал заморачиваться. Выполнить такой прием можно, но дополнительных очков я за него не дам ))
Предлагается обработка с игрой. Код открыт, конструктивная любая критика приветствуется.
Обработка подготовлена для загрузки в конфигурацию на основе БСП во внешние обработки. Выполняется в безопасном режиме. Подключайте ее в свои рабочие базы и изгоняйте стресс на работе )) (На свой страх и риск! Сначала проверьте код!) Так же ее можно открывать через файл в любой конфигурации, не на основе БСП, хоть в пустой.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.11.461
Вступайте в нашу телеграмм-группу Инфостарт