Как стать автором
Обновить

Umka обрастает мясом: улучшения в языке, менеджер пакетов, применение в играх

Уровень сложностиСредний
Время на прочтение3 мин
Количество просмотров2.2K

Только что вышла новая версия 1.3 моего встраиваемого скриптового языка Umka со статической типизацией. С момента выпуска версии 1.0 язык пополнился замыканиями, инструкцией выбора switch по фактическому типу интерфейса, тернарным условным оператором, более удобным API для взаимодействия с кодом на C, другими мелкими радостями.

Маленькое, но упрямое сообщество пользователей Umka всерьёз озаботилось библиотеками, появился менеджер пакетов UmBox, загружающий и устанавливающий библиотеки и отслеживающий их зависимости.

Umka живёт в ядре фреймворка Tophat для создания 2D игр. На основе этого фреймворка развивается платформер-головоломка SaveScum. Коллекция пробных уровней для игры была выпущена в декабре в виде адвент-календаря, принеся с собой дух простого геймерского счастья в наш проект.

Замыкания

Замыканий ждали давно. В коде на Umka появлялось всё больше обработчиков событий (даже функция main() в играх на Tophat стала лишь назначать обработчик кадра). Передавать контекст в виде отдельного параметра в каждый такой обработчик становилось всё утомительнее.

Наконец, появились замыкания, хотя и с немного непривычными особенностями:

  • Каждый экземпляр замыкания имеет явный список захватываемых переменных — примерно так, как это принято в C++.

  • Переменные захватываются по значению, а не по ссылке. Если переменную требуется модифицировать и сохранять между вызовами — нужно явно захватывать указатель.

Обе черты вполне соответствуют принципу Explicit is better than implicit, который Umka заимствует у Python в надежде следовать этой максиме точнее и буквальнее. Также можно проследить отчётливую параллель между использованием захватываемых переменных и обычных параметров функции. Наконец, захват по значению избавляет от мук, на которые обрекли себя создатели Go. Семантика захватываемых переменных цикла for в Umka совершенно интуитивна и не требует нелепых идиом вроде i := i. Следующий пример выводит 1, 2, 3, а не 4, 4, 4, как Go:

fn print123() {
    var prints: []fn()
    for i := 1; i <= 3; i++ {
        prints = append(prints, fn() |i| {  // i is captured
            printf("%v\n", i) 
        })
    }
    for _, print in prints {
        print()                 // 1 2 3
    }
}

Начиная с версии 1.3, замыкания полностью интегрированы в систему типов Umka. Например, обычные функции теперь совместимы с замыканиями и могут трактоваться как частный случай замыканий без захваченных переменных.

Менеджер пакетов

Стандартная библиотека Umka всегда была минималистичной — отчасти это вытекало из требования полного отсутствия внешних зависимостей у самого интерпретатора языка. Разумеется, реальные потребности разработки давно вышли за скромные пределы стандартной библиотеки. Хотя всю специфическую игровую функциональность взял на себя фреймворк Tophat, было предчувствие надвигающегося библиотечного хаоса. Так появился менеджер пакетов UmBox, разработанный автором Tophat Марком Машкаринцем.

Каждый пакет состоит из файла описания в формате JSON (в том числе описания зависимостей от других пакетов) и любых других файлов, упакованных в архив TAR. Как правило, это модули пакета, написанные на Umka, и реализации некоторых функций в виде динамической библиотеки (Umka Module Implementation, UMI).

Серверная часть UmBox написана на Python, а клиентская, с командным интерфейсом, — на самом Umka, с опорой на те же библиотеки, которые UmBox предоставляет пользователю.

Сейчас в списке доступных пакетов — инструменты для работы со строками, регулярными выражениями, файловой системой, логами, форматами CSV и JSON, архивами TAR, шифрованием, запросами по HTTP, построением графиков.

Игры

Платформер-головоломка SaveScum строится вокруг идеи о том, чтобы сохранение и загрузка игры превратились из вспомогательных операций в основу игрового процесса. Игровая механика, намеченная в первой демо-версии в мае прошлого года, теперь усложнена и дополнена взаимодействием с новыми объектами. Дизайнер и разработчик SaveScum Святослав Шатунов выложил 25 тестовых уровней за 25 первых дней декабря. Каждый уровень представлен двумя «сторонами» A и B — они отличаются лишь некоторыми элементами, но и это отличие иногда радикально меняет тактику прохождения уровня. Есть отдельный обучающий уровень, демонстрирующий базовые игровые трюки.

Платформер-головоломка SaveScum. Жёлтую окантовку имеют объекты, не восстанавливающие своё состояние при загрузке игры
Платформер-головоломка SaveScum. Жёлтую окантовку имеют объекты, не восстанавливающие своё состояние при загрузке игры

Адвент-календарь SaveScum принёс нам — разработчикам Umka и Tophat — неожиданную и детски-наивную радость предвкушения. В наш собственный шорт-лист попали уровни 3, 6, 9, 12, 14, 16, 20. Приглашаем присоединиться к тестированию и поделиться впечатлениями!

Демо-версия ещё одной игры — об управлении железнодорожным движением — всё ещё недоступна широкой публике. Однако её развитие продолжается: отработав основу игрового процесса, Марек Машкаринец сосредоточился на визуальном аспекте и сейчас готовит 2D спрайты и анимацию на основе 3D моделей.

Игра об управлении железнодорожным движением
Игра об управлении железнодорожным движением

Теги:
Хабы:
Всего голосов 9: ↑9 и ↓0+9
Комментарии3

Публикации

Истории

Работа

Программист С
33 вакансии

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область