せっかく３面のマップを用意したのだから、stage1→stage2→stage3と切り替わっていくプログラムとする。

まずは font

;; step1 <Fix Ship Position>

;; -----------------------------------------------------------------------------------------------

・・・・・・・・・・・・・・・・・

;; step3 <Font>

;; -----------------------------------------------------------------------------------------------

(defparameter *path-font16* "C:\\WINDOWS\\Fonts\\msmincho.ttc")

(defparameter *font16* (make-instance 'sdl:ttf-font-definition

:size 16

:filename (sdl:create-path *path-font16*)))

(defvar *menu-font*) ; menu font

(defun Set-font ()

(setf *menu-font* (sdl:initialise-font *font16*)))

そして stage class。初期設定では、title-loop を t

;; Step3 <Stage Class>

;; -----------------------------------------------------------------------------------------------

(define-class stage ()

(stage-flag stage-number title-loop start) t)

; stage-flag on-stage or not

; stage-number map change

; title-loop waiting for input-key

; start game start

さらに、「stage 1」を表示するための method

;; Step3 <Start Stage Message>

;; -----------------------------------------------------------------------------------------------

(defvar *atlas*) ; map set

(defgeneric Stage-start-message (stage))

(defmethod Stage-start-message (stage) ; stage start message

"Draw stage start message and set game parameters"

(when (eql (stage-flag stage) t)

(setf (stage-flag stage) nil)

(incf (stage-number stage) 1)

(case (stage-number stage)

(1 (setf *atlas* *map1*))

(2 (setf *atlas* *map2*))

(t (setf *atlas* *map3*)))

(sdl:clear-display sdl:*black*)

(sdl:draw-string-solid-*

(format nil "S T A G E ~d" (stage-number stage)) 272 208 :color sdl:*white* :font *menu-font*)

(sdl:update-display)

(sleep 3)))

初期設定では、title-loop を t にしているが、テストのため、インスタンスを作るときは nil で設定

;; step1 <Game Frame>

;; -----------------------------------------------------------------------------------------------

(defun Common-abogadro ()

・・・・・・・・・・・・・・・・・

; <Set Font>

(Set-font) ; set font

; <Set Charactor Object>

(let((ship (make-instance 'entity :id 0 :x 304 :y 416 :width 32 :height 32 :dx 4 :dy 4 :state 1))

(keystate (make-instance 'keystate))

(game-field (make-instance 'game-field :field-x 160 :field-y 16 :width 480 :height 464))

(stage (make-instance 'stage :stage-number (or nil 0) :title-loop nil)))

・・・・・・・・・・・・・・・・・

(:idle ()

; <Title Off>

(when (eql (title-loop stage) nil) ; game loop

(sdl:clear-display sdl:*black*)

; <Show Message>

(Stage-start-message stage)