`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

Lisp Game Programming 2 <Stage 6-1>

敵のいないシューティングゲームなんて、「○○の入らないコーヒーみたい」(このフレーズを知っている人は相当なオジサン)なので、オリジナルのサイトをまねてやってみた。かなり汚いコードになったが、動けばヨシと割り切る。

まずは、8つの敵の配置データを3面分作成。

50とか70というのは敵の画像データのid。

enemy-map-list.lisp

(defpackage :enemy-map-list
(:use :common-lisp)
(:export #:*enemy-map1* #:*enemy-map2* #:*enemy-map3*))

(in-package :enemy-map-list)

;; step3 <Enemy Map>
;; -----------------------------------------------------------------------------------------------
(defparameter *enemy-map1* (make-array '(65 10):initial-contents

'((-1 -1 -1 -1 70 -1 -1 -1 -1 -1) ; 0

(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 50 50 -1 -1 -1 -1 -1 -1)
(-1 50 50 50 50 -1 -1 -1 -1 -1)
(-1 -1 50 50 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 7 -1 -1 -1 -1 -1 -1 50 -1)
(-1 7 -1 -1 -1 -1 -1 -1 50 -1)
(-1 7 -1 -1 -1 -1 -1 -1 50 -1) ; 10
(-1 7 -1 -1 -1 -1 -1 -1 50 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 17 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 76 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(80 -1 -1 -1 -1 -1 -1 -1 -1 80)
(80 -1 -1 -1 -1 -1 -1 -1 -1 80)
(80 -1 -1 -1 -1 -1 -1 -1 -1 80) ; 20
(80 -1 -1 -1 -1 -1 -1 -1 -1 80)
(80 -1 -1 -1 -1 -1 -1 -1 -1 80)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 18 -1 -1 -1 -1 -1 -1)
(50 -1 -1 -1 -1 -1 -1 -1 -1 50)
(-1 50 -1 -1 -1 -1 -1 -1 50 -1)
(-1 -1 50 -1 -1 -1 -1 50 -1 -1)
(-1 -1 -1 50 -1 -1 50 -1 -1 -1)
(-1 -1 -1 -1 -1 50 -1 -1 -1 -1)
(-1 -1 -1 -1 50 -1 -1 -1 -1 -1) ; 30
(-1 -1 -1 -1 -1 50 -1 -1 -1 -1)
(-1 -1 -1 -1 50 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 7 -1 -1 -1 -1 -1 -1 7 -1)
(7 -1 -1 -1 -1 -1 -1 -1 -1 7)
(-1 7 -1 -1 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 40
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 76 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 17 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 80 -1 -1 -1 -1 -1 80 -1)
(-1 -1 80 -1 -1 -1 -1 -1 80 -1)
(-1 -1 80 -1 -1 -1 -1 -1 80 -1)
(-1 -1 80 -1 -1 -1 -1 -1 80 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 50
(-1 -1 -1 -1 50 50 -1 -1 -1 -1)
(-1 -1 -1 50 -1 -1 50 -1 -1 -1)
(-1 -1 50 -1 -1 -1 -1 50 -1 -1)
(-1 50 -1 -1 -1 -1 -1 -1 50 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 50 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 -1 -1 -1 7 -1 -1 -1) ; 60
(-1 -1 -1 -1 17 -1 -1 -1 -1 -1)
(-1 7 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 7 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 7 -1 -1 -1 -1 -1 -1))))

(defparameter *enemy-map2* (make-array '(65 10) :initial-contents

'((-1 -1 -1 -1 71 -1 -1 -1 -1 -1) ; 0
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 -1 78 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(78 -1 -1 -1 -1 -1 -1 -1 78 -1)
(-1 -1 -1 -1 -1 -1 -1 18 -1 -1)
(7 -1 80 -1 -1 -1 -1 -1 -1 -1) ; 10
(-1 50 -1 7 -1 80 -1 -1 -1 -1)
(-1 -1 7 -1 50 -1 80 -1 -1 -1)
(-1 -1 -1 50 -1 80 -1 -1 -1 -1)
(-1 -1 -1 -1 80 -1 7 -1 -1 -1)
(-1 -1 -1 -1 -1 50 -1 7 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 80 80 -1 -1 -1 -1 -1 7 -1)
(-1 80 80 -1 -1 -1 7 -1 -1 -1)
(-1 80 80 -1 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 20
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(78 -1 -1 -1 -1 -1 -1 -1 -1 78)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 18 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 7 -1)
(-1 7 -1 -1 -1 -1 -1 7 -1 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 7 -1 -1 -1 -1 -1 -1) ; 30
(80 -1 80 -1 80 80 -1 80 -1 80)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 80 80 -1 -1 -1 -1)
(-1 7 -1 -1 -1 -1 80 80 -1 -1)
(-1 -1 80 80 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 80 80)
(80 80 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 80 80 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 40
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(78 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 17 -1 -1 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 7 -1 50 -1 -1 50 -1 7 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 50 -1 -1 50 -1 -1 -1) ; 50
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 50 -1 -1 50 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(7 -1 -1 -1 -1 -1 -1 -1 -1 7)
(-1 80 -1 7 -1 -1 7 -1 80 -1)
(-1 -1 7 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 80 -1 -1 -1 80 -1 -1)
(-1 -1 -1 -1 7 7 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 50 -1 50 50 -1 50 -1 -1) ; 60
(-1 -1 -1 17 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 50 -1 -1 50 -1 -1 -1)
(-1 -1 -1 -1 50 50 -1 -1 -1 -1)
(-1 -1 -1 -1 50 50 -1 -1 -1 -1))))

(defparameter *enemy-map3* (make-array '(65 10) :initial-contents

'((-1 -1 -1 -1 72 -1 -1 -1 -1 -1) ; 0
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 18 -1 -1 -1 -1 -1 -1)
(-1 76 -1 -1 -1 -1 -1 76 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 10
(-1 -1 -1 -1 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 76 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 76 -1 -1 -1 -1 76 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 80 -1 80 -1 -1 -1 -1 -1)
(80 -1 -1 7 -1 -1 -1 -1 -1 80)
(-1 -1 -1 -1 -1 80 -1 80 -1 -1) ; 20
(-1 50 -1 -1 50 -1 -1 -1 -1 -1)
(-1 50 -1 -1 50 -1 -1 -1 7 -1)
(-1 50 -1 -1 50 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 17 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(78 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 80 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 80 -1)
(-1 78 -1 -1 -1 -1 -1 -1 -1 -1) ; 30
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 78 -1 -1 -1 78 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(50 50 50 -1 -1 -1 -1 -1 50 -1)
(50 50 50 -1 -1 -1 -1 -1 50 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1) ; 40
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(7 -1 -1 -1 76 -1 -1 -1 -1 -1)
(-1 7 -1 -1 -1 -1 -1 76 -1 -1)
(-1 -1 7 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 76 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 17 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 78 -1 -1 -1 -1 -1) ; 50
(-1 -1 80 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 80 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 80 -1 -1 -1 -1 -1)
(78 -1 -1 -1 -1 -1 -1 -1 -1 78)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 -1 -1 -1 -1 -1 -1 -1 -1)
(50 -1 -1 -1 -1 -1 -1 -1 80 -1)
(-1 50 -1 -1 -1 -1 -1 -1 -1 -1)
(-1 -1 50 -1 -1 -1 80 -1 -1 -1)
(-1 -1 -1 50 -1 -1 -1 -1 -1 -1) ; 60
(-1 -1 -1 -1 -1 -1 -1 -1 7 -1)
(-1 -1 -1 -1 -1 -1 -1 7 -1 -1)
(-1 -1 -1 -1 -1 -1 7 -1 -1 -1)
(-1 -1 -1 -1 -1 7 -1 -1 -1 -1))))

プログラムの中では、それぞれの画像データにidを振っているので、-1は空白を意味するデータとしてセットする。

この配列は64→63→・・・→0行の順に読み込んでいくために使用する。

加えて、敵の動き方をx方向とy方向の移動量として(x y)の形で配列にした。

たとえば、(-8 4)は左に8ドット、下に4ドットを意味するから、*enemy-move-pattern1*では、敵が左右にフラフラ動きながら下降していくことになる。

move-pattern.lisp ⇒ 

(defpackage :move-pattern
(:use :common-lisp)
(:export #:*enemy-move-pattern1* #:*enemy-move-pattern2* #:*enemy-move-pattern3*
#:*enemy-move-pattern4* #:*enemy-move-pattern5* #:*enemy-move-pattern6*
#:*enemy-move-pattern7* #:*enemy-move-pattern8*))

(in-package :move-pattern)

;; step7 <Enemy-move-pattern>
;; -----------------------------------------------------------------------------------------------
(defparameter *enemy-move-pattern1* (make-array '(16 2) :initial-contents

'((-8 4) ; 0
(-6 4)
(-4 4)
(-2 4)
(0 4)
(2 4)
(4 4)
(6 4)
(8 4)
(6 4)
(4 4) ; 10
(2 4)
(0 4)
(-2 4)
(-4 4)
(-6 4))))

(defparameter *enemy-move-pattern2* (make-array '(12 2) :initial-contents

'((2 2) ; 0
(2 4)
(2 6)
(2 8)
(2 8)
(2 6)
(2 4)
(2 2)
(2 -1)
(2 -2)
(2 -2) ; 10
(2 -1))))

(defparameter *enemy-move-pattern3* (make-array '(16 2) :initial-contents

'((1 3) ; 0
(1 3)
(1 3)
(1 3)
(1 3)
(1 3)
(1 3)
(1 3)
(0 1)
(0 1)
(0 1) ; 10
(0 1)
(0 1)
(0 1)
(0 1)
(0 1))))

(defparameter *enemy-move-pattern4* '(0 2)) ; 0

(defparameter *enemy-move-pattern5* '(1 2)) ; 0

(defparameter *enemy-move-pattern6* (make-array '(32 2) :initial-contents

'((-2 1) ; 0
(-2 1)
(-2 1)
(-2 1)
(-2 1)
(-2 1)
(-2 1)
(-2 1)
(2 1)
(2 1)
(2 1) ; 10
(2 1)
(2 1)
(2 1)
(2 1)
(2 1)
(2 -1)
(2 -1)
(2 -1)
(2 -1)
(2 -1) ; 20
(2 -1)
(2 -1)
(2 -1)
(-2 -1)
(-2 -1)
(-2 -1)
(-2 -1)
(-2 -1)
(-2 -1)
(-2 -1) ; 30
(-2 -1))))

(defparameter *enemy-move-pattern7* (make-array '(32 2) :initial-contents

'((-2 -2) ; 0
(-2 -2)
(-2 -2)
(-2 -2)
(2 2)
(2 2)
(2 2)
(2 2)
(-2 2)
(-2 2)
(-2 2) ; 10
(-2 2)
(2 -2)
(2 -2)
(2 -2)
(2 -2)
(2 2)
(2 2)
(2 2)
(2 2)
(-2 -2) ; 20
(-2 -2)
(-2 -2)
(-2 -2)
(2 -2)
(2 -2)
(2 -2)
(2 -2)
(-2 2)
(-2 2)
(-2 2) ; 30
(-2 2))))

(defparameter *enemy-move-pattern8* '(0 0)) ; 0

敵の配置データを使用するとこんな感じの画面になる。

f:id:tomekame0126:20150613201840p:plain