Lisp Game Programming 2 <Stage 14>
最後はお約束のasdfを使うためのパッケージ化。
package.lisp ⇒
;;;; package.lisp (defpackage :game (:use :common-lisp :lispbuilder-sdl :sprite-sheets :map-list :enemy-map-list :audio-list :move-pattern :shot-data) (:nicknames :shooting) (:export #:Common-abogadro))
そして、asdファイルの作成。
common-abogadro.asd ⇒
;;;; common-abogadro.asd (asdf:defsystem :common-abogadro :version "0.1" :description "A remake of abogadro made with HSP" :author "tomekame0126" :license "GPL v2" :depends-on (:lispbuilder-sdl :lispbuilder-sdl-ttf :lispbuilder-sdl-mixer) :serial t :components ((:file "sprite-sheets") (:file "map-list") (:file "enemy-map-list") (:file "audio-list") (:file "move-pattern") (:file "shot-data") (:file "package") (:file "common-abogadro")))
load命令の場所をコメントアウト。
;; step1 <Sprite Sheets> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\sprite-sheets.lisp") ;; step2 <Map> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\map-list.lisp") ;; step7 <Enemy Map List> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\enemy-map-list.lisp") ;; step7 <Enemy Map List> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\move-pattern.lisp") ;; step10 <Audio> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\audio-list.lisp") ;; step13 <Enemy Shot Data> ;; ----------------------------------------------------------------------------------------------- ;(load "C:\\work\\shot-data.lisp")
今回は、package.lispを作ったので、in-packageを除き該当する部分をコメントアウト。
;; step1 <Define Package> ;; ----------------------------------------------------------------------------------------------- ;(defpackage :game ; (:use :common-lisp :lispbuilder-sdl :sprite-sheets :map-list :enemy-map-list :move-pattern ; :audio-list :shot-data) ; (:nicknames :shooting) ; (:export #:Common-abogadro)) (in-package :game)
最後の(common-abogadro)もコメントアウト。
;(common-abogadro)
ab-step13.lisp ⇒ common-abogadro.lispにリネームしてコンパイルし、
(asdf:operate 'asdf:load-op :common-abogadro)
そして、実行。
(game:common-abogadro)
せっかくだからsbclrcに追記し、Emacs+Slimeを起動し直してから、また(game:common-abogadro)を実行してみる。
(require :asdf) (dolist (dir (directory "C:\\Program Files (x86)\\Steel Bank Common Lisp\\1.1.12\\site\\*\\")) (pushnew dir asdf:*central-registry* :test #'equal)) (dolist (dir (directory "C:\\work\\")) (pushnew dir asdf:*central-registry* :test #'equal)) ;; load lispbuilder-sdl (asdf:operate 'asdf:load-op :lispbuilder-sdl) (asdf:operate 'asdf:load-op :lispbuilder-sdl-binaries) (asdf:operate 'asdf:load-op :lispbuilder-sdl-image) (asdf:operate 'asdf:load-op :lispbuilder-sdl-image-binaries) (asdf:operate 'asdf:load-op :lispbuilder-sdl-ttf) (asdf:operate 'asdf:load-op :lispbuilder-sdl-ttf-binaries) (asdf:operate 'asdf:load-op :lispbuilder-sdl-mixer) (asdf:operate 'asdf:load-op :lispbuilder-sdl-mixer-binaries) (asdf:operate 'asdf:load-op :lispbuilder-sdl-mixer-examples) (asdf:operate 'asdf:load-op :lispbuilder-sdl-gfx) (asdf:operate 'asdf:load-op :lispbuilder-sdl-gfx-binaries) (asdf:operate 'asdf:load-op :cl-opengl) (asdf:operate 'asdf:load-op :cl-glu) (asdf:operate 'asdf:load-op :cl-glut) (asdf:operate 'asdf:load-op :cl-glut-examples) (asdf:operate 'asdf:load-op :nibbles) (asdf:operate 'asdf:load-op :usocket) (asdf:operate 'asdf:load-op :split-sequence) (asdf:operate 'asdf:load-op :bordeaux-threads) (asdf:operate 'asdf:load-op :common-abogadro) ;;; The following lines added by ql:add-to-init-file: #-quicklisp (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname)))) (when (probe-file quicklisp-init) (load quicklisp-init)))
うまく動けば、めでたしめでたし。
ちなみにfaslファイルはこの場所にひっそりとできていました。
C:\Users\[ユーザ名]\AppData\Local\common-lisp\cache\sbcl-1.1.12-win-x86\C\work
ついでに、実行ファイルを作り、うまく動くかどうか試してみた。
こんなものを用意し、
main.lisp ⇒
;; Common-abogadro ;;-------------------------- (defun main () ;; Load SDL ;;-------------------------- (cffi:define-foreign-library sdl (t (:default "SDL"))) (cffi:use-foreign-library sdl) ;; Run the game ;;-------------------------- (sdl:with-init () (game:common-abogadro)) ;; Quit ;;-------------------------- (sb-ext:exit))
こんなことをして、
(load (compile-file "c:\\work\\main.lisp"))
こんなことをすると、いつものようにでっかいファイルができあがる。
※M-x shellをしてからsbclを起動する必要あり。
(sb-ext:save-lisp-and-die "c:\\work\\common-abogadro.exe" :toplevel 'main :executable t)
せっかくだから、Dos窓が開かないように小細工してみた。
common-abogadro.vbs ⇒
CreateObject("WScript.Shell").Run "C:\work\common-abogadro.exe",0
いい感じで起動し実行できるが、途中でフリーズ!!
だめじゃん!!
H28.1.3 訂正
SBCL 1.3.1 にバージョンアップした際に上記プログラムにBugがあることが分かったので修正を行った結果、作成した「実行ファイル」は正常に動作した。
ごめんなさいね。