Siv3Dで作るゲームにフォントを埋め込みたい! って時は

この記事はSiv3D Advent Calendar 2017 6日目の記事です。

Advent Calenderっていうのは、クリスマス限定のカレンダー機能を含んだカードとか箱の類です。
よくわからない人は画像を見るべし。このページに戻ってこなくなっちゃったら悲しいので、リンクは貼らんぞ!!!

はじめに

Siv3D、便利でいいですよね。ウィンドウ作成やメッセージループ、画像の汎用処理などに手間を割かれず、核心であるゲームの開発により集中ができるので、ろくに完成しないのについつい変なゲームを作ってしまう程度に魅力的です。

さて、いくつもSiv3Dでゲームやらそれ未満のものやらを作っていると、ある現象に襲われます。それは

デフォルトのフォント飽きた。

というやつです。

Siv3DはM+フォントを内蔵しており、環境に左右されにくく、そして質の高いきれいな日本語を表示できるようになっているのですが、しかしまあ人間というのは欲張りなもので、時にはフォントを変えたいと思うことも出るのです。

方法

ただしフォントを変えるのには少々壁があります。デフォルトのフォント以外を使おうとする場合、

という方法のどれかを選ぶことになります。

テキストの使用量が少なく、「はじめから」「ゲームオーバー」など、使う表現がごく限られているなら、おとなしく画像を作成して使ったほうが、事前にエフェクトもかけ放題ですし、問題は少ないです。
困るのはRPGやノベルゲームなどの文章を表示させるものの場合で、これは容量の関係上画像を使うわけにも行かないため、前者2つの方法を使うか、諦めてデフォルトのフォントを使わざるを得ません。

一つ目のフォント名だけを指定する方法は、Windowsであれば"MS ゴシック"や"メイリオ"あたりは多くの人が持っているので、 これを指定しておけばほぼ間違いなく製作者が開発時に見ていたものと同じフォントが使われることでしょう。

「このゲームで遊ぶ人は全員Microsoft Officeを持っているに違いない!」

と思ってしまった人は"HG創英角ポップ体"などを指定するのも手だと思います。

……冗談はさておき、もしあなたがソースコードをオープンにする場合は、MacやLinuxでビルドされる可能性がある以上、決め打ちと洒落込むのはあまりに無謀ですし、またソフトだけを公開する場合でも、LinuxではWineを使うことでWindowsアプリケーションが実行できるため、 そのような環境で遊ぶ人については同じフォントがあるはずもなく、イメージは異なるものになってしまうでしょう。(WineでSiv3Dを使ったゲームが動くのかは未確認ですし、アレはバージョンにより動いたり動かなかったりがよく変わった印象あり)

メリットとしては、配布の際にフォントファイルを含まないのでファイルサイズが少し軽くなる点です。

ソフトの配布時にフォントを含ませるという方法は、ソフトの配布パッケージにフォントを含ませて、ソフト側から呼び出して使うものです。こうすると確実にこちらの狙った字体での表示が実現できるわけです。

が、しかし。

ライセンスの問題

その場合はフォントに適用されているライセンスの問題があります。

ソフトウェアにフォントを含める場合というのは結構注意が必要でして。簡単に言うと、「たとえそれが商用利用可能を謳ったフリーフォントであっても禁止事項にあたる場合がある」ということです。

早い話が、
「このフォントを使った画像データを作るのは一向に構わないが、フォントそのものを配布するのは許さん!」
というタイプのライセンスが結構存在するので、よそ様のフォントをゲームに組み込む場合は注意が必要なのです。

もちろん配布してもOKなフォントもあります。よくライセンスを確認すると良いでしょう。 ちなみに有料フォントをゲームへ埋め込んで配布しようとする場合は別途それなりの料金がかかるようで、1回お金払ったからゲームに埋め込みOKというわけではないのでご注意を。

じゃあ、埋め込んでみよう

フォントファイル自体の配布が禁止されていても、ソフトウェアへの埋め込みは許可されている場合があります。この場合は実行ファイルのリソースとして埋め込むことで問題を回避できると考えられます。

というか、「フォントファイルそのものをゲームプログラムのパッケージに同梱する」という考え方がざっと調べた限りフォント配布界隈には見当たりませんでした。再配布に制限がないフォントや、完全に自作したフォントでない限りは埋め込みを推奨します。

さて、ここに無理をしてゲームの画面を模したSiv3Dアプリがあります。
フォントはデフォルトのものです。

いぇーやすのやぼー

このプロジェクトに、外部フォントとして、たぬき侍氏の作成した「たぬき油性マジック」を埋め込んでみましょう。
たぬき油性マジック : http://tanukifont.com/tanuki-permanent-marker/

なお、たぬき油性マジックのライセンスは、抜粋すると

・WEBサイト、印刷物(同人誌を含む)、映像、ゲームへの埋め込み、iPhone/Androidアプリ、フォント埋込みPDFでの使用は個人、商用問わず無料で利用可能です。

(中略)

■禁止事項

  • 当フォントファイル(TTFファイル本体)を無断で販売する行為。
  • 当フォントを改変したものやトレースしたものを、フォントファイル形式にして販売する行為。

(2017/12/5現在)

と書かれているため、今回のデモ用として使用することができます。
しかし、フォントファイルそのものをゲームに同梱して配布する(=フォントファイルをユーザーのPCに簡単にインストールできる状態にする)ことに関しては明言されていません。想定はしていないのでしょう。こういう場合は、極力アプリケーションに埋め込んだほうが良いと思います。

exeファイルへのデータファイル埋め込みは、リソーススクリプトに記述をすることで実現することができます。
リソースファイルの欄にResource.rcという名前のファイルがあるので、右クリックからコードを表示させます。 この際、ダブルクリックや「開く」だと「リソースビュー」が開いてしまうので注意しましょう。

リソーススクリプトを開く

リソースファイルのコードは、今回のようなファイルの埋め込みを行う場合、「ID、リソースの種類(FILE)、埋め込みに使うファイルの名前」の順で記述します。

というわけで、フォントを埋め込むように記述します。
埋め込み記述を追加した図 そして、C++のソースコードの方で、読ませるフォントを指定するのですが。

あれ? リソースからどう読ませるんだ?

というのにお答えするのがこの記事のキモです。
いや、Siv3Dのマニュアルを見ればちゃーんと書いてはいるのですが、複数のトピックを見ておかないとわからない部分なんですね。そこで記事を書いた次第です。

結論を言うと、

Siv3Dではファイル名を指定するときに、ファイル名ではなく L"/数字"と書くことで、
その番号に該当するリソースを読み込むことができる

ということです。

あとは
公式のマニュアル
の手順に従い、FontManager::Register()を呼んでフォントをロードし、fontの宣言時にフォント名を指定すればOKなので、下のような感じ。


//メインループ以前のところで呼ぶ
if (!FontManager::Register(L"/64646"))return;
Const Font font(13, L"フォント名");

フォント名はファイル名ではなく、フォントファイルをダブルクリックしたときに出てくるフォント名です。全角と半角が紛らわしいので注意。

実行結果はこちら。

たぬき油性マジック

いやー、くっきりはっきりしておりますな。

ついでに他のフォントでも試してみます。

oradano明朝

http://www.asahi-net.or.jp/~sd5a-ucd/freefonts/Oradano-Mincho/

敵グラフィックから醸し出される厳粛で重苦しい雰囲気!
歴戦のパーティーも震え上がる強大な敵との戦闘の連続、
興奮と緊張の大スペクタクル……!

oradano明朝 フォントを使用した場合の見栄え

無心

http://modi.jpn.org/font_mushin.php

アットホームな雰囲気が特徴なRPGです。「よろいをきたおとこ」あたりのギャグポイントが高い。
今日も帰ったらゲームやろう。

無心 フォントを使用した場合の見栄え

と、まあ、フォントの選定はゲーム全体の雰囲気にかなり重要な印象を与える要素であり説明文の雰囲気まで変わっちゃいそうな勢いなので、いつものフォントに物足りなさを感じたらその気持を大事にして、フォント変えてみようってお話でした。
でもライセンスにはご注意な。