Lisp Game Programming 2 <Stage 4>
せっかく3面のマップを用意したのだから、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)