読者です 読者をやめる 読者になる 読者になる

`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

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
f:id:tomekame0126:20151026093736p:plain

ついでに、実行ファイルを作り、うまく動くかどうか試してみた。
こんなものを用意し、
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)

f:id:tomekame0126:20151026144208p:plain
せっかくだから、Dos窓が開かないように小細工してみた。
common-abogadro.vbs ⇒

CreateObject("WScript.Shell").Run "C:\work\common-abogadro.exe",0

いい感じで起動し実行できるが、途中でフリーズ!!
だめじゃん!!
f:id:tomekame0126:20151026192907p:plain

H28.1.3 訂正

SBCL 1.3.1 にバージョンアップした際に上記プログラムにBugがあることが分かったので修正を行った結果、作成した「実行ファイル」は正常に動作した。
ごめんなさいね。