`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

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))