>> 古い記事: Gimp: ペンや消しゴムにそれぞれ別のブラシを割り当てる
<< 新しい記事: 対訳: LINA よくある質問

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ren'Py: メッセージを日本語で表示する(v6.3.2未満)

[2007-08-22]
v6.3.2 で日本語サポートが変更されたため、以下の記述は古いものになりました。 v6.3.2 以降を使う場合はこちらの新しい記事を参考にしてください。

※何かの参考になるかもしれないので一応この記事も残しておきます。


日本人向けにゲームを作るためには最低限地の文やセリフなどのメッセージだけでも日本語で表示できなければ、 ということで調べてみました。
結論としてはデフォルトフォントに日本語フォントを指定するだけで大丈夫です。


まずは game ディレクトリ内に使いたい .ttf ファイルを置きます。

次に、Ren'Py のエディタを開き「options.rpy」タブを選択。 フォントを指定する以下のような箇所がありますので、 コメントを外して先ほどの .ttf ファイル名を書いておきます。

# list A
        # style.default.font = "DejaVuSans.ttf"
         ↓
        style.default.font = "VL-PGothic-Regular.ttf"

options.rpy の代わりに script.rpy の init ブロックに書いても同じ動作をするようです。

# list B
init:
    $ style.default.font = "VL-PGothic-Regular.ttf"

大元のデフォルトフォントを日本語フォントに

[追記 070710]
(Ren'Pyを解凍してできたフォルダ)\common\
以下に日本語フォント foo.ttf を置いて
common\00style.rpy の以下の箇所を修正すると
大元から変更できます。
# list C
    # 変更前
    style.default.font = "DejaVuSans.ttf"
    # 変更後
    style.default.font = "foo.ttf"
ランチャーのメニューのフォントなんかも
foo.ttf に変わります。

v6.3.0 で確認。

日本語テキストの自動折り返しと禁則処理

[追記 070807]


下のコードは本家クックブックの記事 拝借したものです。 ただし、そのままだと自分の環境ではエラーが出たため一部変更しました。

一応はこれで自動折り返し・禁則処理が可能になります。 Windows版 v6.3.1 で確認したところ少々ぎこちない(ちょっとひっかかる)動作だと感じましたが、 Linux版 v6.3.1 では普通に滑らかに表示されました。 (まあ、Win版のもそのうち改良されるんじゃないかと甘く期待)


まずは上記の方法で デフォルトフォントを変更します。

init ブロックに以下を追加します。 ソースは UTF-8 で保存します。

# list D
init:
    # 改行の処理
    python hide:

        # These are characters for which line breaking is forbidden before them.
        # In our algorithm, they try to cling to the back of a word.
        # これらの文字の前では改行しない(単語の後ろにくっつける)
        not_before  = ur'\!\"\%\)\,\-\.\:\;\?\]\u2010\u2019\u201d\u2030\u2032\u2033'
        not_before += ur'\u2103\u2212\u3001\u3002\u3005\u3009\u300b\u300d\u300f\u3011'
        not_before += ur'\u3015\u3017\u3041\u3043\u3045\u3047\u3049\u3063\u3083\u3085'
        not_before += ur'\u3087\u308e\u309b\u309c\u309d\u309e\u30a1\u30a3\u30a5\u30a7'
        not_before += ur'\u30a9\u30c3\u30e3\u30e5\u30e7\u30ee\u30f5\u30f6\u30fc\u30fd'
        not_before += ur'\u30fe\uff01\uff02\uff05\uff09\uff09\uff0c\uff0d\uff0e\uff1a'
        not_before += ur'\uff1b\uff1f\uff3d\uff5d\uff5d\uff61\uff63\uff9e\uff9f'

        # These are characters for which line breaking is forbidden after them.
        # In our algorithm, they try to cling to the front of a word.
        # これらの文字の後では改行しない(単語の前にくっつける)
        not_after  = ur'\"\#\$\(\@\[\u00a2\u00a3\u00a5\u00a7\u2018\u201c\u266f'
        not_after += ur'\u3008\u300a\u300c\u300e\u3010\u3012\u3014\u3016\uff03\uff04'
        not_after += ur'\uff08\uff08\uff20\uff3b\uff5b\uff5b\uff62\uffe0\uffe1\uffe5'

        # These are ranges of characters that are treated as western. 
        # (And hence are always grouped together as a word.
        # 西洋文字? 範囲で指定。ひとまとめにして途中で分割しない。
        western = ur'\'\w\u000a-\u007a\u007c\u007e\u024f\uff10-\uff19\uff20-\uff2a\uff41-\uff5a'

        regexp = ur"""(?x)
          (?P<space>[ \u200b])
        | \{(?P<tag>[^{}]+)\}
        | (?P<untag>\{\{)
        | (?P<newline>\n)
        | (?P<word>([%(not_after)s]*"""
        regexp += ur'([^ \n\{\u200b%(not_before)s%(not_after)s%(western)s]|[%(western)s]+)'
        regexp += ur'[%(not_before)s]*)|[%(not_after)s]|[%(not_before)s])'% locals()

        import re

        store._cjk_regexp = re.compile(regexp)
        
        # トーカナイズ関数
        def text_tokenizer(s, style):
            """
            This functions is used to tokenize text. It's called when laying
            out a Text widget, and is given the string that is the text of the
            widget, and the style associated with the widget.

            It's expected to yield some number of pairs. In each pair, the
            first element is the kind of token found, and the second element
            is the text corresponding to that token. The following token
            types are defined:

            "newline" -- A newline, which when encountered starts a new line.

            "word" -- A word of text. A line will never be broken inside of
            a word.

            "space" -- A space. Spaces are always placed on the current line,
            and will never be placed as the start of a line.

            "tag" -- A text tag. If encountered, the second element should be
            the name of the tag, without any enclosing braces.
            """

            for m in store._cjk_regexp.finditer(s):
                if m.group('space'):
                    yield 'space', m.group('space')
                elif m.group('word'):
                    yield 'word', m.group('word')
                elif m.group('tag'):
                    yield 'tag', m.group('tag')
                elif m.group('untag'):
                    yield 'word', '{'
                elif m.group('newline'):
                    yield 'newline', m.group('newline')

        config.text_tokenizer = text_tokenizer

v6.3.1 で確認。list D のライセンスは以下の通り。

Copyright 2004-2007 PyTom <pytom@bishoujo.us>

以下に定める条件に従い、本ソフトウェアおよび関連文書のファイル(以下「ソフトウェア」)の複製を取得するすべての人に対し、ソフトウェアを無制限に扱うことを無償で許可します。これには、ソフトウェアの複製を使用、複写、変更、結合、掲載、頒布、サブライセンス、および/または販売する権利、およびソフトウェアを提供する相手に同じことを許可する権利も無制限に含まれます。

上記の著作権表示および本許諾表示を、ソフトウェアのすべての複製または重要な部分に記載するものとします。

ソフトウェアは「現状のまま」で、明示であるか暗黙であるかを問わず、何らの保証もなく提供されます。ここでいう保証とは、商品性、特定の目的への適合性、および権利非侵害についての保証も含みますが、それに限定されるものではありません。作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。

関連記事

クロスプラットフォームなノベルゲームエンジン Ren'Py
- 導入~プロジェクト新規作成を簡単に紹介
テーマ:ゲーム製作 関連 - ジャンル:ゲーム

>> 古い記事: Gimp: ペンや消しゴムにそれぞれ別のブラシを割り当てる
<< 新しい記事: 対訳: LINA よくある質問
** ホームに戻る

コメント

コメントの投稿

管理者にだけ表示を許可する

|
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。