среда, 13 января 2016 г.

Zombies Ate My Cow (Lisp Game Jam)

На новогодних праздниках я с товарищами turtle_bazon и c1tr00z приняли участие в Lisp Game Jam, посвященному разработке игр на диалекте лиспа.


Нашей целью было написать законченную игру за отведенный срок. Решили, что игра должна работать в браузере, чтобы легко делиться ею. Тут нам приглянулся яваскриптовый движок для игр Phaser. Оставался выбор между clojurescript и parenscript. С common lisp я опыт не имел, но т.к. не удалось сходу запустить демо на clojurescript, выбор пал на parenscript. К тому же clojure - функциональный язык, а т.к. мы выбрали Phaser, то мультипарадигменный common lisp подходил больше.

Ход джема

Т.к. на реализацию была дана неделя, за идею взяли упрощенную версию Зельды на тему зомби (тупой ИИ будет оправдан). В первый день устроили hangout, где обсудили цели и задачи. c1tr00z взялся за графику, а я с turtle_bazon стали делать базовый геймлпей, попутно осваивая Phaser. Активная разработка шла в основном ночью (хоть и праздники, но дел до вечера хватало). После того, как наш персонаж научился ходить и стрелять по мертвым зомби, я занялся оживлением зомби (учил их ходить, бить и плеваться), а turtle_bazon - эффектами и геймлпеем (рождение и гибель зомби, эффект "страха" у зомби, выпадание еды, крутой пистолет). Это позволило нам избежать конфлитов при merge. Игра постепенно становилась живой, был добавлен главарь зомби, появилась цель игры - убить босса. Но игра была уж слишком легкой - босса легко можно было убить и с обычной пушкой, стоило игроку попасть в него один раз, и под "страхом" его легко было добить, зомби не успевали добежать до игрока, а зомби-плеваки - плюнуть. С боссом решением стало новая способность - телепортация, а для эффективности обычных зомби создали лабиринты. В итоге игра стала гораздо сложнее и стало интересно играть!

Выводы

Работа с Phaser'ом понравилась. Всё, что нам нужно было, в ней было (анимация, 2D-физика, звуки). Проблем не было. Рекомендую!

С common lisp'ом у меня опыта не было, пришлось настравить emacs, ставить slime. Со slime'ом пришлось повозиться, т.к. следованием туториалу дело не обошлось. Пришлось смотреть конфиги emacs'а turtle_bazon'a. Для написания кода хватило моих знаний scheme и clojure и подглядывание за turtle_bazon'ом.

Parenscript показался очень простым. Javascript, который он генерировал, был легко читаем. При ошибке компиляции можно посмотреть, где именно ошибка, выполнив команду (compile-parens) в slime'е. Но с parenscript'ом было ощущение, что пишешь не на лиспе, а на javascript'е. Возможно, тут еще играли роль сжатые сроки, поэтому мы не особо экспериментировали. Так что, возможно, на parenscript'е и можно писать в стиле лиспа, но у нас получился javascript. Итог – если просто хочется скобочек, пробуйте parenscript, если нужно что-то большее - надо экспериментировать.

Что мы получили от участия?

Весело провели время. Получили опыт работы в команде в сжатые сроки. А главное – получили удовольствие от результата – законченной игры!

Что получилось:

Играть

Sources

Screenshots: