🔖

Lem Advent Calendar 2023 - SDL2 Frontend - 2Dゲーム編

2023/12/05に公開

これは Lem Advent Calendar の記事です。

概要

SDL2 frontendが動くようになり、画像をバッファに表示できるようになれば、エディタ上でゲームを作って動かせるようになります。

そしてそれを作ってみたのがこのリポジトリです。
https://github.com/cxxxr/mygame


ゲームを起動して動かした後、inspectorからキャラクターの位置を直接書き換えたりしています。

Timer

Lemにはタイマーという機能があり、指定した秒数毎にcallback関数を呼び出せます。

(start-timer (make-timer (lambda () ...) milli-seconds :repeat t)

これを使って数百ミリ秒毎に描画対象の画像を切り替えることでアニメーションが出来ます。

パフォーマンス上の問題

start-timerはlem用のAPIとして用意していることもあり、統合されていて便利なのですがパフォーマンス上の懸念があります。
どういうことかというと、タイマー用のcallback関数が呼び出される毎に画面全体を再描画する処理が走るからです。
一応無駄な再描画を防ぐためキャッシュされる仕組みはありますが、
それでもキャラクター単位でタイマーを使うと、キャラクターの数だけアニメーションする度に再描画処理が実行されるのでもたつくことがあります。

そのため、lemのタイマーとは別の仕組みを導入する必要があります。
ゲーム用のメインループをユーザーが用意できるようにし、その中でアニメーションするとうまくいきそうです。
これは今後の課題です。

完成しましたか?

していません。
https://itch.io/jam/spring-lisp-game-jam-2023 にLemで参戦しようとしたのがこれを作ったきっかけですが、結局参加せずに頓挫してしまいました。

おわりに

テキストエディタ上で2Dゲームを作って動かせると、ドット絵エディタも用意したくなりますね。
きっとゲームは完成するし、パフォーマンス上の問題も解決できるでしょう。

Discussion