`(kakko ,man)

Find a guide into tomorrow by taking lessons from the past

cl-glut pre-study <page 1>

これまでは、HSPで作られたシューティングゲーム2本をcommon-lispでリメイクしてみた。
lispbuilder-sdlは結構便利で、若干古さは否めないものの簡単なゲームを作るには十分だと感じた。
だけど、グラフィックスと言えばopenGLは外せない。
なので、どこまで自分が理解できるか、つまみ食いをしてみる。
※先のページでsbclrcにcl-opengl、cl-glu、cl-glutを書き加えてあるのはそのため。

さて、common-lispopenGLを使うためには、まずここからdownloadする。
※ダウンロードファイル名はcl-opengl-master.zip
https://github.com/3b/cl-opengl

展開したら、以下のホルダに、展開したホルダごとファイルを追加した。
C:\Program Files (x86)\Steel Bank Common Lisp\1.1.12\site

そして、freeglutのdownload。
※ダウンロードファイル名はfreeglut-MSVC-3.0.0.2-2.mp
http://www.transmissionzero.co.uk/software/freeglut-devel/

展開したらbinホルダの中のfreeglut.dllをC:\Windows\System32に移動。
※多分32bit用
また、binホルダ内のx64ホルダにある同名のfreeglut.dllをC:\Windows\SysWOW64に移動。
※多分64bit用

こんな感じで、インストールを完了させ、後は前述のsbclrcの設定を実施。

pre-studyなので勉強の材料をさがしたところ、その筋ではかなり有名らしいサイトがあったので、勝手にインターネット聴講生にさせていただきました。(何十年ぶり?)
http://www.wakayama-u.ac.jp/~tokoi/opengl/libglut.html
しまった、Cで書いてあるじゃん。と思ったけど、プログラムなんてみんな同じで何となくわかるだろうと高をくくり、cl-glutで挑戦。

レッスン1.空のウィンドウを開く
lesson1.lisp

;;
;; lesson1 <Open the window>
;; -----------------------------------------------------------------------------------------------
;; Init window
(defclass Window (glut:window) 
  ())
;; Main
(defun lesson1 ()
  (glut:display-window (make-instance 'Window)))  ; create window

(lesson1)

f:id:tomekame0126:20151031175534p:plain

PC画面の左上にウィンドウ出現。
すげぇ。こんなもんでウィンドウができるんだ。
※タイトルを入れないと、処理系とそのバージョンがタイトルに出現。(どっから引っ張ってくるんだろ?)

レッスン2.ウィンドウを塗りつぶす
lesson2.lisp

;;
;; lesson1 <Open the window>
;; lesson2 <Fill in the blue>
;; -----------------------------------------------------------------------------------------------
;; Set window class
(defclass Window (glut:window) 
  ()
  (:default-initargs
   :mode '(:rgba)))

;; Init
(defmethod glut:display-window :before ((window Window))
  (gl:clear-color 0 0 1 1))                  ; set blue

;; Display
(defmethod glut:display ((window Window))
  (gl:clear :color-buffer-bit)               ; clear buffer
  (gl:flush))                                ; show window

;; Main
(defun lesson2 ()
  (glut:display-window (make-instance 'Window)))  ; create window

(lesson2)

f:id:tomekame0126:20151031180436p:plain

cl-glutでのwindow関連の定義はここを参照してくださいな。
https://github.com/3b/cl-opengl/blob/master/glut/interface.lisp
それと、ここを照らし合わせてみると、なんとなく関数がやっていることがイメージできそう。
http://quickdocs.org/cl-opengl/api#system-cl-glut

今日はこの辺で勘弁してやるか。
つづく(かな?)