2019/04/21(日) [n年前の日記]
#2 [rubysdl][ruby] Ruby/SDLでSFontが表示されなくてハマった
Ruby/SDL は SFont形式のビットマップフォントを描画できるはずなのだけど。
Windows10 x64 + Ruby 1.9.3 p661 mingw32 + rubysdl 2.1.1.1 で、SFont を描画しようとしても、png画像のSFontをそもそも開けないことに気が付いた。以下のようなエラーが出てしまう。
Ruby/SDL が使われていた頃の Ruby のバージョンを調べてみたら、1.8 だった。ということは、Ruby 1.8 + Ruby/SDL なら動作が違ってくるのだろうか。
そして、Ruby/SDL は、2.0.0 から Ruby 1.9.x に対応したらしい。すると Ruby 1.8 には、Ruby/SDL 1.3.1 を使ったほうが、昔のスクリプトを動かす分にはヨサゲかもしれないなと。
試しに、Ruby 1.8.7 p330 mswin32 上で、rubysdl 1.3.1 (rubysdl-1.3.1-mswin32-1.8.6-p36.zip) をインストール。
それぞれで動作確認してみたところ、結果は以下のようになった。
つまり、SFont については、以下のような状態になる。
ただ、以下の記事によると、*NIX環境 + Ruby/SDL 2.2.0 なら、png の SFont も読み込めるっぽい。
_Ubuntu に Ruby/SDL を入れる - Marginalia
Windows10 x64 + Ruby 1.9.3 p661 mingw32 + rubysdl 2.1.1.1 で、SFont を描画しようとしても、png画像のSFontをそもそも開けないことに気が付いた。以下のようなエラーが出てしまう。
sfont.rb:69:in `open': Couldn't open font: font/verabd_sfont01_32col.png (SDL::Error)
from sfont.rb:69:in `<main>'
おかしいな。手元のスクリプトを眺めた感じでは、昔は png の SFont をフツーに読み込めていたように見えるのだけど…。Ruby/SDL が使われていた頃の Ruby のバージョンを調べてみたら、1.8 だった。ということは、Ruby 1.8 + Ruby/SDL なら動作が違ってくるのだろうか。
そして、Ruby/SDL は、2.0.0 から Ruby 1.9.x に対応したらしい。すると Ruby 1.8 には、Ruby/SDL 1.3.1 を使ったほうが、昔のスクリプトを動かす分にはヨサゲかもしれないなと。
試しに、Ruby 1.8.7 p330 mswin32 上で、rubysdl 1.3.1 (rubysdl-1.3.1-mswin32-1.8.6-p36.zip) をインストール。
それぞれで動作確認してみたところ、結果は以下のようになった。
| Ruby | Ruby/SDL | load bmp | load png |
|---|---|---|---|
| Ruby 1.8.7 p330 mswin32 | rubysdl 1.3.1 | PASS | PASS |
| Ruby 1.9.3 p661 mingw32 | rubysdl 2.1.1.1 | PASS | FAIL |
つまり、SFont については、以下のような状態になる。
- Windows版の Ruby/SDL 2.0.0 以降は、SFont として png画像は使えず、bmp画像を使う必要がある。
- png画像が読み込めないから、諧調を持ったアルファチャンネルは利用不可。
ただ、以下の記事によると、*NIX環境 + Ruby/SDL 2.2.0 なら、png の SFont も読み込めるっぽい。
_Ubuntu に Ruby/SDL を入れる - Marginalia
◎ サンプルスクリプトと画像。 :
動作確認用にスクリプトを書いてみた。
※ 2019/04/22追記。サンプルとしては分かりづらかったので書き直した。
_sfont.rb
_sfontex.rb
sfontex.rb は、カーソルキーの左右で、SFontの種類を切り替えられる。ESC で終了。
使った SFont画像は以下。元にしたttfフォントはライセンス面で自由度が高いものを選んだ、はず。ファイル名を見ればフォント名も分かるかと。
_verabd_sfont01_32col.bmp
_verabd_sfont01_32col.png
_verabd_sfont01.png
_verabd_sfont02_width_fix.png
_sfont_mplus1m_m.png
_vlgothic_sfont01.png
一応、画像表示もしておくかな…。
※ 2019/04/22追記。サンプルとしては分かりづらかったので書き直した。
_sfont.rb
# Ruby/SDL birmap font (SFont) draw.
#
# ESC key : exit
require "sdl"
fontimg = "font/verabd_sfont01_32col.bmp"
#fontimg = "font/verabd_sfont01.png"
SDL.init( SDL::INIT_VIDEO )
screen = SDL::Screen.open(640, 480, 16, SDL::SWSURFACE)
fontflag = SDL::BMFont::TRANSPARENT | SDL::BMFont::SFONT
font = SDL::BMFont.open(fontimg, fontflag)
while true
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
when SDL::Event2::KeyDown
case event.sym
when SDL::Key::ESCAPE
exit
end
end
end
screen.fill_rect(0, 0, 640, 480, [128, 128, 128])
font.textout(screen, fontimg, 0, 0)
x, y = 8, 64
font.textout(screen, "SFont (BitMapFont) Testing..", x, y)
screen.updateRect(0,0,0,0)
sleep 0.016
end
_sfontex.rb
# Ruby/SDL birmap font (SFont) draw.
#
# usage: ruby sfont.rb [font_kind]
# RIGHT, LEFT : change font
# ESC : exit
require "sdl"
fontdir = "font/"
fontfiles = [
"verabd_sfont01_32col.bmp",
"verabd_sfont01_32col.png",
"verabd_sfont01.png",
"verabd_sfont02_width_fix.png",
"sfont_mplus1m_m.png",
"vlgothic_sfont01.png",
]
kind = ARGV.size > 0 ? ARGV[0].to_i : 0
if kind >= fontfiles.size
puts "please input 0 - #{fontfiles.size - 1}"
exit
end
fontfile = fontfiles[kind]
puts "font image : #{fontfile}"
SDL.init( SDL::INIT_VIDEO )
screen = SDL::Screen.open(640, 480, 16, SDL::SWSURFACE)
fontflag = SDL::BMFont::TRANSPARENT | SDL::BMFont::SFONT
font = SDL::BMFont.open(fontdir + fontfile, fontflag)
ang = 0
while true
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
when SDL::Event2::KeyDown
font_reload = false
case event.sym
when SDL::Key::ESCAPE
exit
when SDL::Key::RIGHT
kind = (kind + 1) % fontfiles.size
font_reload = true
when SDL::Key::LEFT
kind = (kind - 1 + fontfiles.size) % fontfiles.size
font_reload = true
end
if font_reload
fontfile = fontfiles[kind]
puts "font image : #{fontfile}"
font = SDL::BMFont.open(fontdir + fontfile, fontflag)
end
end
end
screen.fill_rect(0, 0, 640, 480, [128, 128, 128])
font.textout(screen, fontfile, 0, 0)
y = 64.0 * Math.sin(ang * Math::PI / 180) + 128
ang += 1
font.textout(screen, "SFont (BitMapFont) Testing..", 8, y)
screen.updateRect(0,0,0,0)
sleep 0.016
end
sfontex.rb は、カーソルキーの左右で、SFontの種類を切り替えられる。ESC で終了。
使った SFont画像は以下。元にしたttfフォントはライセンス面で自由度が高いものを選んだ、はず。ファイル名を見ればフォント名も分かるかと。
_verabd_sfont01_32col.bmp
_verabd_sfont01_32col.png
_verabd_sfont01.png
_verabd_sfont02_width_fix.png
_sfont_mplus1m_m.png
_vlgothic_sfont01.png
一応、画像表示もしておくかな…。
◎ 動作時のスクリーンショット。 :
[ ツッコむ ]
以上です。
