`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

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)