четверг, 12 января 2012 г.

Программирование компьютерных игр в Common Lisp при помощи lispbuilder-sdl

Сегодня сбылась мечта идиота: нашёл пакет для графики в Common Lisp, с помощью которого можно рисовать игры с графикой и звуком. Это не GUI пакет с виджетами, это 2D/3D канва и инициализаторы для звука, джойстика и CDROM. Пакет называется lispbuilder-sdl, и он крут.

Как обычно, напомню для себя, как lispbuilder-sdl подключается в SBCL.

Написание программы, использующей lispbuilder-sdl

На странице Using Lispbuilder SDL приведён пример того, как оформлять игровую main loop, используя этот пакет. Однако, полезным будет напомнить процесс собственно работы с этим кодом до того момента, когда на экране, наконец-то, появится окно с демо-игрой.

Во-первых, нужно загрузить сам lispbuilder-sdl. Я это сделал с помощью quicklisp, так что, понятное дело, чтобы следовать дальнейшим инструкциям, к лиспу должен быть подключен quicklisp.

Во-вторых, нужно разместить код примера в файле. Допустим, файл называется sdl-trivial.lisp. После этого, в начале файла нужно приписать загрузку lispbuilder-sdl и инициализацию пакета, внутри которого разместим наш код:

(ql:quickload :lispbuilder-sdl)

(defpackage :sdl-trivial
  (:use :lispbuilder-sdl :common-lisp))

(in-package :sdl-trivial)

;; Код примера вставляется сюда ;;

Всё, можно запускать. Переходим в каталог с файлом sdl-trivial.lisp и запускаем в этом каталоге свой лисп, у меня это sbcl:

$ cd путь/до/sdl-trivial.lisp
$ sbcl

Переходить в каталог с файлом нужно, чтобы не пришлось писать полный путь до него внутри самого sbcl.

В лиспе загружаем наш файл и обязательно заходим в наш новый пакет, определённый в sdl-trivial.lisp. После этого можно запускать базовую функцию примера.

(load "sdl-trivial.lisp")
(in-package :sdl-trivial)
(mouse-rect-2d)

Как посмотреть на возможности lispbuilder-sdl двумя строчками кода

На странице мануала lispbuilder-sdl есть раздел с готовыми примерами. Если неохота возиться с примером, описанным выше, то можно просто сделать внутри лиспа следующее (при наличии установленного quicklisp):

(ql:quickload :lispbuilder-sdl-examples)
(SDL-EXAMPLES:DISTANCE-2D)