Category Archives: Programing

プログラム

チャプターごとにゲームを開始できるようにする

WikiLogo
ver 6.14.1

チャプターごとにゲームを開始できるようにする

書いてある通りです(・ω・)以上!

screens.rpy の中にある main_menu のあたりを探してメニュー項目を追加するだけ!

        textbutton _("Start Chapter 2") action Start("chapter2")

action Start の引数にラベル名を入れる。空の場合はゲームの先頭から開始になる。
開発中はショートカット代わりに作っても便利ヾ(・ω・)ノ

キャラクター名を独自ウィンドウで表示

WikiLogo
ver 6.14.1

How do I put the character’s name in its own box? に書いてるけど…英語っていうね(;´д`)
以下、内容を簡単適当良い加減超意訳してみた。

Q: どのようにキャラクター名の独自表示領域を設置できますか?
A: “show_two_window” を使えば可能です。
もしあなたがキャラクターの名前をメインウィンドウの外に表示したいとき、次の式をを加える必要があります。

$ e = Character("Eileen", show_two_window=True)

この名前ウィンドウの配置、背景などを編集するには、次の例のように属性を変更することで可能です。

    style.say_who_window.background = Frame("frame.png", 15, 15) #Background skin
    style.say_who_window.xalign = 0.0
    style.say_who_window.yalign = 1.0
    #style.say_who_window.xpos = 100 #For precise placement
    #style.say_who_window.ypos = 100 #For precise placement
    style.say_who_window.left_padding = 15
    style.say_who_window.top_padding = 15
    style.say_who_window.right_padding = 15
    style.say_who_window.bottom_padding = 15
    style.say_who_window.xminimum = 150
    style.say_who_window.yminimum = 15
    style.say_who_window.xfill = False

とりあえずメインウィンドウの外に表示ができた。
全体のイメージが決まるまではデフォルト設定で使ってみよう(・ω・)

レイヤー上に文字を表示する

WikiLogo
ver 6.14.1

暗い画面の真ん中に、「第一章」と白い文字を浮かべる。
これからゲームが始まるときの区切りや、タイトルの演出などに使います。
割りとありきたりな表現ですが、ユーザーへここが区切りであることを伝えやすい方法ですね。

label start:
    show expression Text("第一章", size=36, yalign=0.45, xalign=0.5, drop_shadow=(2, 2)) as text1
    show expression Text("-人の心を持った人形が人間ならば、花の心を持った人間は花になれるのだろうか-", size=18, yalign=0.55, xalign=0.5, drop_shadow=(2, 2)) as text2
    with Dissolve(1.5)
    pause(4.0)
    hide text1
    hide text2
    with Dissolve(1.5)

show expression Text という命令を使うと、
キャラクターや背景に被せるようにし上部レイヤーに文字を表示できます。
上記の例だと、中央に上下2列でDissolveをかけて表示しています。

pauseをかけて文字の演出をコントロールしてるんだけど、クリックされると
ぱたっとDissolveとかが途切れちゃう。クリック無効にする方法もあるみたいだけど
なんだか上手く行かなかった。色々難しいです。

ルビをつける

WikiLogo
ver 6.14.1

文章にルビをつけるには、まず options.rpy のスタイル設定を変更する。
チュートリアルゲームから該当箇所をまるまんま流用したので詳しいことはわからないヽ(・ω・)/

    ## Note that these only change the size of some of the text. Other
    ## buttons have their own styles.

    style.default.line_leading = 10 # デフォルトのテキスト行間
    style.button_text.line_leading = 0 # ボタンテキストの行間

    style.ruby_style = Style(style.default)
    style.ruby_style.size = 10 # ルビのフォントサイズ
    style.ruby_style.yoffset = -20 # ルビの縦軸位置

    style.default.ruby_style = style.ruby_style # デフォルトのルビ設定に変更を適用する

んでもって、script.rpy などのラベル内文章に {rb}文章{/rb}{rt}ルビ{/rt} という形式で入力するだけ。

label start:
    "{rb}帝都{/rb}{rt}ていと{/rt}。"
    "かつてそう呼ばれた場所、東京。"

普通はゲーム内にルビを振ることはそう多くないと思うのだけど、
友人から誘われたゲームはルビが盛り沢山!(゚д゚;)
手作業ではとても時間がかかってしまう上にヒューマンエラーの可能性も多くなるので、
ルビを辞書化してしまって自動変換することを考えてみた。

といっても、プログラムのド素人が出来ることはたかが知れてるけどね!(ノ∀`)

NVLモード : ナレーションの設定

WikiLogo
ver 6.14.1

NVLモードで会話以外の文章(ナレーション)をさせるには、Characterで定義するが、
通常のキャラ設定のように定義すると、設定したキャラ名(この例ではn)を何度も書かなければいけない。

define n = Character(None, kind=nvl)

label start:
    n "実直で堅実な父だったが、大きな劣等感を抱えていた。"
    n "それは息子であるところの僕に遺憾なく発揮された。"

ナレーションにはデフォルトで予約されている変数narratorがあるので、
そこにNVLモードの設定をしてあげると楽ができます。

define narrator = Character(None, kind=nvl)

label start:
    "実直で堅実な父だったが、大きな劣等感を抱えていた。"
    "それは息子であるところの僕に遺憾なく発揮された。"

ADVモードに戻りたい時は

    $ narrator = Character(None, kind=adv)

といった命令を設定すると元のADVモードに戻ります。

NVLモード : ウィンドウの表示/非表示

WikiLogo
ver 6.14.1

Ren’Pyには2つの表示モードが標準実装されています。
・ADVモード: デフォルトではこのアドベンチャーモードです。恋愛ゲーム等に見られる画面上部にキャラクター表示、画面下部に会話が表示される形式です。
・NVLモード: ノベルモード。かまいたちの夜のような画面全体に文章が表示され、背景としてキャラクターなどが表示される形式。

NVLモードへの変更についてはWikiに説明があるのでそちらを参考にされると良いと思います。
ここでは備忘録として簡単にまとめておきます。

NVLモードに変更するには scrript.rpy などに下記を付け加えます。

init python:
    config.empty_window = nvl_show_core # NVLモード・ウィンドウの制御を有効化
    config.adv_nvl_transition = dissolve
    config.nvl_adv_transition = dissolve

config.empty_window を nvl_show_core に設定すると、NVLモード・ウィンドウは、トランジションを伴って表示されます。
最後の2行では、ウィンドウの表示/非表示の切り替えに使われる既定のトランジションを設定しています。

有効化することで、windowコマンドによってウィンドウの表示/非表示ができるようになります。

NVLモードでtransitionを使った場面転換をすると、ADVモードのウィンドウが一瞬表示されたりします。
デフォルトではtransition時にウィンドウを表示し続ける設定になっていますが、これをtransitionするときには
ウィンドウを消すように設定(False)すると、NVLモードにADVモードのウィンドウが出てくることはありません。

init python
    # トランジション中もウィンドウを表示させる場合はフラグをTrueに
    _window_during_transitions = False

参考
NVLモード・チュートリアル

ファイル入出力時に文字コードを指定する

python_logo
ver2.7

codecsモジュールのopen関数を使う。

import codecs

fp = codecs.open("read.txt", "r", "shift_jis") # shift_jisのread.txtを読み込む
fp = codecs.open("write.txt", "w", "utf-8") # utf-8でwrite.txtに書き込む

実行後のwrite.txtには文字コードがUTF-8で出力される

参考
[文字コード] ファイル入出力時にエンコードを指定する – nelnal@python
Pythonライブラリリファレンス 4.9 codecs — codec レジストリと基底クラス

日本語の文章に対応させる

WikiLogo
ver 6.14.1

Ren’Pyは元々英語圏のソフトなので、標準では日本語の文章が正常にゲーム画面に表示されなかったりする。
サンプルゲームや、チュートリアルソフトもそのままだと英語でよくわからない(´・ω・`)

Wikiのチュートリアルに「チュートリアルゲーム日本語訳(v6.14)」があります。
ダウンロードして解答した中にある3つのファイルを、ゲーム毎に個別のgameディレクトリに置くと日本語化は完了です。
1. VL-Gothic-Regular.ttf (日本語フォントファイル)
2. translations.rpt
3. translations.rpy

ファイルの内容をテキストエディタで見るとわかりますが、はすごく簡単な仕組みになっています。

< Help
> ヘルプ

日本語→日本語の変換もできるのか試してみましたが反映はされませんでした。英語→日本語の場合しかうまくいきません。
ルビ変換をこのtranslations.rpt でやれたら楽なのになぁとちょっと残念。
でも文章データ側で英語の人物名表記をしておいて翻訳ファイルで日本語の人物名にするなど、多言語化は比較的対応がしやすそうです。

ソースの難読化

WikiLogo
ver 6.14.1

ちょっと気になったのが、配布したときにソースが丸見えになってしまうこと。
テキストエディタとかで普通に分岐の条件とかフラグが見えてしまう;;
でもどうやらそれを読みにくくする機能がRen’Pyにはついてるらしい(・ω・)

でもランチャーにはそんな機能はなく・・・。
よくよく調べてみたら、options.rpyに書くところがあった。

    ## To archive files, classify them as 'archive'.
    build.classify('game/**.png', 'archive')
    build.classify('game/**.jpg', 'archive')

上の例だと、pngやjpgの画像がビルドしたときにはarchive.rpaって1つのファイルに格納されて、
個別のファイルで見れないようになりますよーってことみたい。
難読化っていうぐらいだから、暗号化みたいに絶対見れないってわけじゃなさそうです。
プログラマーとかなら解析できるけど、一般の人はすぐには見れないかもって感じでしょうか。

    build.classify('game/**.png', 'archive') #png形式のイメージファイル
    build.classify('game/**.jpg', 'archive') #jpg形式のイメージファイル
    build.classify('game/**.ogg', 'archive') #ogg形式のオーディオファイル
    build.classify('game/**.rpy', 'archive') #プログラムファイル
    build.classify('game/**.rpyc', 'archive') #プログラムの中間ファイル
    build.classify('game/**.ttf', 'archive') #フォントファイル

いまはとりあえずこんな設定にしてみます(・ω・)b

はじめてのRen’Py

WikiLogo

ひょんなことから同人ゲームを作ることになり、プログラムとか何それ美味しいの?状態な僕が
Ren’Pyを使ってプログラマーもどきをすることになった。

一体どうしてこうなった/(^o^)\

というわけで、英語やPythonとの死闘が始まりそうな予感・・・。
記事を書いている現在、Ren’Pyのバージョンは6.14.1で、
数少ない日本語解説サイトとは既にランチャーのインターフェイスが違うみたいだ。

まぁ・・・なんとかなる・・・のか?`,、(‘∀`) ‘`,、