Lispbuilder-SDLのインストール
Lispでゲームを作りたいと思い、UbuntuにLispbuilder-SDL(Common LispからSDLを使うライブラリ)をインストールしてみました。
今回はその手順を書いておきます。
Common Lisp処理系には、apt-getでインストールしたSBCLを使っています。
準備
Lispbuilderでは、Common LispからC言語のライブラリを使うためにcffiというライブラリを使っているのでそれをインストールします。
sudo apt-get install cl-cffi
Ubuntuならパッケージからインストールできます。
インストール
Lispbuilder本体をインストールします。Common Lispではパッケージのインストールに、ASDFというソフトを使います。
ASDFはRubyでいうgemのようなものらしいです。SBCLをインストールした時にASDFも一緒にインストールされているはずです。
ASDFはパッケージを自動でダウンロードする機能を持っていますが、ASDFに登録されているダウンロード先が404になってしまっているようなので、Lispbuilderの公式サイトからファイルをダウンロードしてインストールします。
http://code.google.com/p/lispbuilder/ の「Featured downloads」のところから lispbuilder-sdl-0.9.8.1.tgz をダウンロードしようとしましたがなぜかうまくいかないので、
wget http://lispbuilder.googlecode.com/files/lispbuilder-sdl-0.9.8.1.tgz
として直接ホームディレクトリにダウンロードしました。
次に、
sudo sbcl
で、rootとしてSBCLを起動します。今回はホームディレクトリ以下ではなく/usr/lib/sbcl/siteにインストールするのでroot権限が必要になります。
起動したら、
(require 'asdf-install) (asdf-install:install "lispbuilder-sdl-0.9.8.1.tgz")
でインストールを始めます。
まず、Install where?と聞かれます。今回はSystem-wideを選択したので、「1」と入力しエンターを押しました。
「compiling」と書かれたメッセージがたくさん出てくるのでしばらく待ちます。
途中、「debugger invoked on a ASDF-INSTALL::KEY-NOT-FOUND」というエラーが何度か出ますが、「0」と入力してエンターを押せばそのまま先に進めます。
インストールが完了し、「* 」と表示されてREPLに戻ったら、
(sb-ext:quit)
でSBCLを終了します。
サンプルを動かしてみる
曲線を引くサンプルを動かしてみます。
普通に
sbcl
でSBCLを起動し、
(asdf:operate 'asdf:load-op :lispbuilder-sdl-examples)
でLispbuilder-SDLとサンプルを読み込みます。少し時間がかかります。
(sdl-examples:bezier)
でサンプルを起動します。曲線がいくつか出てきたら成功です。
Lispbuilder-SDLを使ったサンプルプログラム
マウスで画像を動かすサンプルを書いてみました。
(defvar *image* nil) (sdl:with-init () (sdl:window 320 240 :title-caption "Lispbuilder-SDLサンプル") (setf (sdl:frame-rate) 30) (setf *image* (sdl:load-image "lisp.bmp")) (sdl:update-display) (sdl:with-events () (:quit-event () t) (:video-expose-event () (sdl:update-display)) (:idle () (sdl:clear-display sdl:*black*) (sdl:draw-surface-at-* *image* (sdl:mouse-x) (sdl:mouse-y)) (sdl:update-display))))
ソースコードのファイル名は、今回はsdltest.lispというファイル名にしています。
lisp.bmpは、適当なbmpファイルを使います。
実行は、sbclを起動して
(require 'lispbuilder-sdl) (load "sdltest.lisp")
です。
ライブラリを読み込むのには少し時間がかかります。マウスの位置に合わせて画像が動きます。
sdl:with-initやsdl:frame-rateなど、そのままのSDLよりも使いやすいように作られているようです。