Akane を Renderer を使って描画させる

Akane を GPiCASE で動かせるように修正しましたが、自前で拡大・縮小処理をしているのでちょっと不満でした。

GPiCASE で Akane を動かす

 試しに、SDL2 で Renderer を使って時計を作ってみたら意外と簡単にできました。

SDL2 で時計を作る

 Renderer の使い方もわかってきたので、Akane で Renderer を使ってみました。

 ちょっとハマったのが、Raspberry Pi 4B ではうまく行くのに、Raspberry Pi Zero でうまく行かなかったことがありました。

 これは、変更箇所のみを描画させていたため、バッファに以前の画像が残っていない場合にうまく行きませんでした。説明を見ると次のように書いてありました。

SDLのレンダリング関数は背面バッファを操作する. つまり, SDL_RenderDrawLine()のようなレンダリング関数を呼んでも, 背景バッファに線が描かれるだけで, 直接画面には描かれない. グラフィックを描いた後, 背景バッファを画面に反映させる必要がある.
背景バッファは反映した後は無効になると考える必要がある. つまり, 前のフレームのグラフィックが残っているとみなしてはならない. 全てのピクセルを上書きする場合でも, 各フレームを描く前にSDL_RenderClear()を呼んで背景バッファを初期化することを強く推奨する.

http://sdl2referencejp.osdn.jp/SDL_RenderPresent.html

 つまり、SDL_RenderPresent() を呼び出して画面を更新した後、次に描画するときには全てを描画しなければならないということです。

 Renderer で描画を実装したので、ウィンドウをリサイズできるようになり、自前で拡大/縮小をする必要はなくなりました。しかし、スムージングとかはしてくれず、縮小した場合に文字や画像が荒くなりました。

 そこで、ウィンドウサイズが画像の半分以下の場合、元データからぼかしをかけたものを作り、その画像を使って表示するようにしました。処理が増えるので、ちょっと遅くなりますが、Raspberry Pi Zaro でもゲームをすすめる上で問題になる程遅くなることはありません。

 デスクトップ上で好きな大きさで表示できるようになりました。GPiCASE での表示もいくらかマシになっています。

Akane

Posted by sirius