LÖVE (Love2D) 入門編:8.文字表示とフォント

(2018.7.25. 公開) (2018.8.26. 対象をバージョン 11 系列に変更)

1. 文字表示

 文字を表示するには、love.graphics.print() を使う。(白地に黒で表示するようにしてみた。)

-- サンプルプログラム 8-01 main.lua
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)  -- 背景を白にする
  love.graphics.setColor(0, 0, 0)            -- 文字色を黒にする
end
function love.draw()
  love.graphics.print("Print String", 0, 0)  -- 文字列を表示する
end

 文字列のあとの2つの数値は、文字列を表示する位置である。最初の文字の左上の位置を指定する。

 フォントを何も指定しなければ、デフォルトの Bitstream Vera Sans, 12 ポイントが使用される。フォントサイズを変更するには、love.graphics.newFont() でフォントを作成し、それを love.graphics.setFont() で設定する。

-- サンプルプログラム 8-02 main.lua
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)  -- 背景を白にする
  love.graphics.setColor(0, 0, 0)            -- 文字色を黒にする
  font = love.graphics.newFont(24)           -- 24ポイントのフォントを作る
  love.graphics.setFont(font)                -- そのフォントを設定
end
function love.draw()
  love.graphics.print("Print String", 0, 0)  -- 文字列を表示する
end

 2つ以上のフォントを使い分けたい時は、少し注意を要する。たとえば、"String1" を 12 ポイント、"String2" を 24 ポイントで表示したいとする。上のプログラム例では love.load() の中でフォントを設定していたが、これだと1種類のフォントしか使えない。そこで、love.draw() の中で、love.graphics.setFont() を使うことになる。ところが、次のようにプログラムを書くと、コンピュータの動作がとても重くなる。

-- サンプルプログラム 8-03 main.lua
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)  -- 背景を白にする
  love.graphics.setColor(0, 0, 0)            -- 文字色を黒にする
end
function love.draw()
  font = love.graphics.newFont(12)           -- 12ポイントのフォントを作る(重い)
  love.graphics.setFont(font)                -- そのフォントを設定
  love.graphics.print("String1", 0, 0)       -- String1 を表示する
  font = love.graphics.newFont(24)           -- 24ポイントのフォントを作る(重い)
  love.graphics.setFont(font)                -- そのフォントを設定
  love.graphics.print("String1", 0, 20)      -- String2 を表示する
end

 重くなる理由は、次の通りである。love.graphics.newFont() は、呼び出されるたびに「新しいフォントオブジェクト」を作成する。「オブジェクトを作成する」という動作は、比較的負担が大きい。ところが、love.draw() は何度も繰り返し呼び出されるため、そのたびに love.graphics.newFont() が呼び出され、同じ内容のフォントを表すオブジェクトがいくつも作成されることになる。これでは無駄が大きい。

 次のように書けば、負担を小さくできる。重い処理を love.load() で済ませておき、得られたフォントオブジェクトを変数に保持しておいて、love.draw() ではそれを使ってフォントを設定する。

-- サンプルプログラム 8-04 main.lua
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)  -- 背景を白にする
  love.graphics.setColor(0, 0, 0)            -- 文字色を黒にする
  font12 = love.graphics.newFont(12)         -- 12ポイントのフォントを作る(重い)
  font24 = love.graphics.newFont(24)         -- 24ポイントのフォントを作る(重い)
end
function love.draw()
  love.graphics.setFont(font12)              -- 12ポイントのフォントを設定
  love.graphics.print("String1", 0, 0)       -- String1 を表示する
  love.graphics.setFont(font24)              -- 24ポイントのフォントを設定
  love.graphics.print("String1", 0, 20)      -- String2 を表示する
end

2. 日本語の表示

 Bitstream Vera Sans というフォントは、日本語の文字を持っていない。このため、日本語の文字を表示しようとすると、下のように「豆腐」が表示されてしまう。

-- サンプルプログラム 8-05 main.lua
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)  -- 背景を白にする
  love.graphics.setColor(0, 0, 0)            -- 文字色を黒にする
  font = love.graphics.newFont(24)           -- 24ポイントのフォントを作る
  love.graphics.setFont(font)                -- そのフォントを設定
end
function love.draw()
  love.graphics.print("にほんごニホンゴ日本語", 0, 0) -- 日本語の文字列を表示する
end

 日本語を表示するためには、日本語フォントを指定しなくてはならない。無料で自由に使える日本語フォントを探しましょう。国の機関である情報処理推進機構 (IPA) が開発した IPA フォントIPAex フォントは、確実に利用できる。その他にも、特徴あるフォントがいろいろ公開されている。「TrueType」形式のフォントであれば、LÖVE で利用できる。

 日本語フォントの中には、再配布が許可されていない(つまり、あなたのプログラムに同梱できない)や、商用利用が許可されていないなど、利用制限がついているものも多いので、よく調べること。IPA フォントは再配布が許可されているので、こちらにも置いておきました→ ipag00303.zip

-- サンプルプログラム 8-05 main.lua
-- ipag.ttf (IPAゴシックフォント) が必要
function love.load()
  love.graphics.setBackgroundColor(1, 1, 1)    -- 背景を白にする
  love.graphics.setColor(0, 0, 0)              -- 文字色を黒にする
  font = love.graphics.newFont("ipag.ttf", 24) -- IPAゴシック、24ポイントのフォントを作る
  love.graphics.setFont(font)                  -- そのフォントを設定
end
function love.draw()
  love.graphics.print("にほんごニホンゴ日本語", 0, 0) -- 日本語の文字列を表示する
end

 なお、日本語をコンピュータで取り扱う際に、「どの文字をどういう数値で表すか」について、いくつかの流儀がある。これを「エンコーディング」と呼ぶ。昔は、「シフトJIS」や「EUC」というエンコーディングがよく使われていたが、現在は「UTF-8」というエンコーディングに統一されつつある。上記のプログラムを保存する時は、エンコーディングが「UTF-8」になっていることを確かめてください。

 上記のプログラムを「シフトJIS」や「EUC」エンコーディングで保存すると、下のようなエラーが出る。「Invalid UTF-8(不正なUTF-8)」と言ってますね。

目次