Lisp Game Programming <Step11-1>
Step11の最初はshipがenemy、enemy-shotと衝突した場合の処理プログラム
互いの位置が重なったかどうかで衝突を判断しているが、重なった場合、hitフラグをonにし、enemy、enemy-shotのstateを0(dead)にして、shipのstateを2(explode)に設定しつつ、explode-cntを0に設定して爆発カウンターを起動する
;; Step11 <Judge Enemy Shot Hit>
;; -----------------------------------------------------------------------------------------------
(defgeneric Ship-hit-p (ship foe))
(defmethod Ship-hit-p (ship foe)
(when (= (state ship) 1) ; if ship is alive
(let ((hit 0))
(dolist (enemy (enemy-list foe))
(when (and (= (state enemy) 1) ; enemies and ship hit
(> (+ (x ship) 16) (x enemy))
(< (+ (x ship) 16) (+ (x enemy) 31))
(> (+ (y ship) 16) (y enemy))
(< (+ (y ship) 16) (+ (y enemy) 31)))
(setf (state enemy) 0
hit 1)))
(dolist (enemy-shot (enemy-shot-list foe))
(when (and (= (state enemy-shot) 1) ; enemies shot and ship hit
(> (+ (x ship) 16) (x enemy-shot))
(< (+ (x ship) 16) (+ (x enemy-shot) 15))
(> (+ (y ship) 16) (y enemy-shot))
(< (+ (y ship) 16) (+ (y enemy-shot) 15)))
(setf (state enemy-shot) 0
hit 1)))
(when (= hit 1)
(setf (state ship) 2 ; ship is explode
(explode-cnt ship) 0))))) ; ship explode count 0