Common Lisp SDL2チュートリアル

SDL2は優れたライブラリですが、チュートリアルはそれほど多くありません。

Common Lispは素晴らしい言語ですが、その記事は悲惨なほど少数です。

このシリーズの記事を書くにはこれで十分だと思います。



なぜ普通のベッドを選んだのですか? まあ、彼らが言うように味と色。

ただし、次の理由があります。







実際、このシリーズは、Lazy Fooのチュートリアルを修正したものです。

lazyfoo.net/tutorials/SDL/index.php



この記事では、必要なソフトウェアをすべてインストールする方法については詳しく説明しませんが、

これが誰かにとって本当に面白いなら、それについて書いてください

コメントで。



SDL2をインストールするには、Fuのヒントlazyfoo.net/tutorials/SDL/01_hello_SDL/index.phpを使用します。



Lispに関しては、 www.sbcl.orgwww.quicklisp.orgの実装を使用します。

現時点では、パフォーマンスはその中でのみテストされています。



次に、cl-sdl2ライブラリgithub.com/lispgames/cl-sdl2を使用します。

たまたまSDL2の一部の機能をサポートしている

表面、それは完全に実装されていません。 しかし、それは問題ではない、私は追加しています

チュートリアルを進めるにつれて必要な機能。 したがってない

quicklispからバージョンをインストールし、すぐにmasterブランチを~/quicklisp/local-projects



にクローンし~/quicklisp/local-projects







Lisp構文の理解は最小限であり、括弧の豊富さを恐れていないことを前提としています。

Lisp環境と対話する主な手段として、スライムを使用します。

あなたはまだspacemacsを試しましたか? それから私たちはあなたに行きます!



歌詞は必要ないがコードは必要な人: github.com/TatriX/cl-sdl2-tutorial



人生の白い画面



まず、SDL2に白で塗りつぶされたウィンドウを表示させるだけです。



明らかに、cl-sdl2ライブラリ自体が必要です。 接続してください:

 CL-USER> (ql:quickload :sdl2)
      
      





タスクを複雑にすることはなく、固定サイズのウィンドウを作成します。

これを行うために、魔法の数字は悪であるため、ウィンドウの幅と高さに対してグローバル(さらに特別な )変数を宣言します。

 (defparameter *screen-width* 640) (defparameter *screen-height* 480)
      
      





次に、ウィンドウを開く関数を作成し、入力します

白い色でしばらく待ってから閉じます。



メイン関数を呼び出して、オプションの

名前付きパラメータを使用すると、その後の時間を調整できます

ウィンドウが閉じます。 デフォルトでは、2秒が目に入っています。

 (defun main (&key (delay 2000))
      
      





次に、sdl2を初期化して、ライブラリに次のことを伝えます。

使用したいサブシステム。 このため、cl-sdl2は便利なマクロを提供します。

  (sdl2:with-init (:video)
      
      





グラフィック出力サブシステムのみを使用するため、

シンボルを送信しましょう:ビデオ。 あなたは尋ねる:「私が推測したはずだったように、

何を正確に送信する必要がありますか?ビデオ?”答える:cl-sdl2変換

対応する文字のSDL_定数。 例えば

SDL_Initメソッドを使用してドキュメントを開き、

利用可能なフラグ: wiki.libsdl.org/SDL_Init#Remarks

必要な文字を取得するには、定数SDL_INIT_の名前を切り取り、

フラグを小文字に変換します。



with-マクロの利点は、それらが必須であることです

割り当てられたすべてのリソースを解放し、必要性から解放します

自分で追跡してください。



OK、次にウィンドウを作成します。

  (sdl2:with-window (window :title "SDL2 Window" :w *screen-width* :h *screen-height*)
      
      





これはマクロを使用した別の方法です。 今回はリストの最初の項目

マクロの引数は、本体内のウィンドウシンボルになります

マクロは、作成されたウィンドウを参照します。 名前付き

パラメータ:タイトル、:w 、: h

説明。



ウィンドウですべてがはっきりしていますが、今度は結果のウィンドウを白で塗りつぶします

色。 計画を実装するためのオプションの1つは、

「表面」、それらは表面です。 実際、表面は構造です

ソフトウェアで使用される特定の領域のピクセルを含む

レンダリング。 たとえば、ウィンドウの表面を取得できます。

  (let ((screen-surface (sdl2:get-window-surface window)))
      
      





白で塗りつぶします:

  (sdl2:fill-rect screen-surface nil (sdl2:map-rgb (sdl2:surface-format screen-surface) 255 255 255))
      
      





最初の引数は、塗りつぶす長方形です。 そうでない場合

転送すると、領域全体が埋められます。 なぜ悲惨な#fff

このような複雑な方法で記録しますか? さまざまな形式がすべてです

ピクセル、画面など。 そして、SDL2ライブラリ以来

必要なすべての変換を適用するためのクロスプラットフォーム

この場合のmap-rgbなど、さまざまな関数が使用されます。



あふれたウィンドウを埋めますが、これでは十分ではありません。 ここで、ウィンドウを更新するようライブラリに丁寧に依頼する必要があります。

  (sdl2:update-window window)
      
      





これまでに説明したプロセス全体が一瞬かかることを考えると、

それでも結果を楽しみたいので、少し待つようにsdlに依頼してください:

(sdl2:遅延遅延)

まあ、最も重要なこと:

 )))
      
      







それだけです。 私たちの作成を実行することは残っており、デバッガにクラッシュしないことを願っています:

 CL-USER> (main)
      
      











念のため

完全なソース
 (defparameter *screen-width* 640) (defparameter *screen-height* 480) (defun main (&key (delay 2000)) (sdl2:with-init (:video) (sdl2:with-window (window :title "SDL2 Window" :w *screen-width* :h *screen-height*) (let ((screen-surface (sdl2:get-window-surface window))) (sdl2:fill-rect screen-surface nil (sdl2:map-rgb (sdl2:surface-format screen-surface) 255 255 255)) (sdl2:update-window window) (sdl2:delay delay)))))
      
      









正直なところ、私は最初の3つのチュートリアルについてすぐに説明するために1つの記事で計画していましたが、どういうわけかすでに多くのテキストが出てきました。



せっかちな人のために、もう一度チュートリアルコードへのリンク(執筆時点では16個):

github.com/TatriX/cl-sdl2-tutorial



おもしろくて有益だったことを願っています。



All Articles