Lisp Game Programming <Step17>
そういえば「楽しみ」のマクロが残っていた。
step3でクラスを作ったが、もっとカッコよくするには?
;;step3 <Character object>
;; -----------------------------------------------------------------------------------------------
(defclass object ()
((%imageid :initarg :imageid :initform 0 :accessor imageid) ; 3 imageid available
(%id :initarg :id :initform 0 :accessor id) ; graphic id in imageid
(%x :initarg :x :initform 0 :accessor x) ; x (upper left corner)
(%y :initarg :y :initform 0 :accessor y) ; y (upper left corner)
(%width :initarg :width :initform 0 :accessor width) ; width (from upper left corner)
(%height :initarg :height :initform 0 :accessor height)) ; height (from upper left corner)
(:documentation "The Object Class"))
これだ!
;; step17 <Macro>
;; -----------------------------------------------------------------------------------------------
(defmacro define-class (name superclasses slots form)
`(defclass ,name ,superclasses
,(mapcar (lambda (slot)
(let ((keyword (intern (symbol-name slot) :keyword)))
`(,slot :initarg ,keyword :initform ,form :accessor ,slot)))
slots)))
これを使うと、step3は以下のように記述できる。
(define-class object ()
(imageid id x y width height) 0)
後は、必要なクラスを必要なだけ置き換えていけばOK!
こんな感じでコメントアウトして下に書き加えていき、動くことを確認したら残すなり削除するなりご自由に。
;; step 4 <Scroll>
;; -----------------------------------------------------------------------------------------------
;(defclass timing ()
; ((%scroll :initarg :scroll :initform 0 :accessor scroll) ; scroll counter
; (%interval :initarg :interval :initform 128 :accessor interval)) ; step 9 add senternce
; (:documentation "The timing Class"))
(define-class timing ()
(scroll interval) 0)
注意点は、インスタンス作成時にintervalの数字を付け加えることを忘れずに!
(timing (make-instance 'timing :interval 128))