2019年07月13日

viewportのスクロールバーの値をキープする


viewportのスクロールバーの値をキープする方法を探しました。
今までviewportを含むスクリーンをhideして再度showすると
スクロールバーの位置が変わってしまって、
今回の作品の仕様上それだと不便だったのですが…何とか解決できました。
コード(抜粋)は以下です。

※ブログの仕様上、以下のコードではインデントが省略されています。

init python:
uia = ui.adjustment()

screen main_menu():
tag menu
viewport:
scrollbars "vertical"
spacing 5
child_size (None, 120 + 105*(len(sl_label) - 1))
yinitial int(select_posi)
viewport id "vp":
draggable True
yadjustment uia

imagebutton:
idle "images/icon_memo1.png"
hover "images/icon_memo2.png"
action [SetVariable("select_posi", uia.value), Call(sl_label[i][0] + "_sch")]


-

それから、折に触れてinit python, define, defaultの違いを確認。

define x=0

init python:
x=0
と同じだそうです。


posted by 倉下 遼 at 09:46 | Comment(0) | Ren'Py

2019年05月08日

セーブ時に任意の情報を加える、ほか


最近更新した中からいくつか。


まず、ツイートの画像3枚目、クイックメニューのウィンドウを隠すボタンは
textbutton _("x") action HideInterface()」で作っています。

だいぶ前に英語でメモしてましたが、念のため再掲。

---

それからツイートの画像2枚目、セーブ画面の情報追加についてです。

screen.rpyの「screen file_picker():」のセクションを見ます。

セーブデータの表示には日付・時刻に加えて
FileSaveName(i)の戻り値、すなわち
ファイルがセーブされたときの「save_name」も表示できるようです。

>> FileSaveName(name, empty=u'', page=None)
>> ファイルがセーブされたときの save_name かファイルが存在しなければ empty を返します。
(ドキュメントより)

つまり、セーブ時にsave_nameに値を与えればよいということになります。

言い換えると、FileAction(i)と同時にsave_nameに値を与えます。

しかし、単純にこれをやるとロードのときにバグります。
screen file_picker()はセーブでもロードでも使われる画面のためです。
従って場合分けをします。
renpy01.png
無駄に文字が多いですが…
「$ save_info = ... 」で save_info(という変数を作った)に文字を入れ、
セーブのときだけこれをsave_nameとして与えています。
SetVariable( )は変数に値を入れるというアクション。

「_last_say_what[:14]」は、セーブしたときにウィンドウに表示されていたメッセージの
頭14文字を取るというものです。後ろに「.replace...」と続いている部分で
改行コードを取り除いています。


尚、TEADはguiが刷新される前に作成していますが
新しいguiで単純に上記をやると表示がおかしくなります。
スタイルをデフォルトから一部変更するか別途定義する必要があるようです
(今回はtextbutton "xxx"に対しbackground None・xsize 30・ysize 15を足しました)。
タグツイートしたら反応してくださった方に教わりました;下記のスレッド一式参照。




posted by 倉下 遼 at 23:16 | Comment(0) | Ren'Py

Ren'pyのカラークラス


先日日記で中途半端に触れた話題ですが…

Ren'pyには独自のカラークラスというのがあるようです
(Pythonのcolorsysだと上手くいかない)。

「#112233」のようなカラーコードからRGB、HSVカラー空間に簡単に変換できます。
また、RGBやHSVのそれぞれの値を変更することで
ある意味お絵かきソフトでシークバーを動かす感覚で(?)色を変えたりできます。

ドキュメント(このページは英語のみ):Color Class

先日遊んでみたもの(読みにくいです、物好きな方向け)。


便利なのは、このくらいの簡単な色変更なら次の2つで出来るようです。
ドキュメントの一番下の方に書いてあります。

shade( xx ): 元の色に 黒色を混ぜた色をつくる。
tint( xx ): 元の色に 白色を混ぜた色をつくる。

いずれもカッコ内には0.0 - 1.0の値を入れます。

例えばキャラクターの定義文などで
what_color = Color("#112233").tint(0.75)
と書くと#112233より少し薄い色を指定することができます。

自分の場合は、キャラクタごとに色を決めているので(例えばディルなら#D26CC0)、
これより少し薄い色を作りたいというときにtintを使いました。

posted by 倉下 遼 at 22:43 | Comment(0) | Ren'Py

2019年04月27日

Ren'pyの読み上げ機能など


最近知ったRen'pyの使い方について幾つかツイートしたり助言を頂いたりしていたので、備忘録としてブログにも転載しておきます。

英語の作品でセリフを読み上げさせて理解しやすくする&リスニングの練習に使うことができることに気づきました。


ゲーム内のHelpを作りこんでいるときにRen'pyの読み上げ機能を知りまして。自分のゲームの誤字チェックにも使えるかなと思ってます。


それから以下のスレッドに続く一連のやりとりでは、extendを使ってセリフ中で表情を変更する場合にトランジションを有効にする方法(を教えていただきました)。


こちらは、スクリプトからセリフを抽出するプログラムを作ってみたら実はRen'pyの標準機能として搭載されているとご指摘いただいたものです;


Ren'pyに関しては他のユーザーの方に助けて頂くことが多くて、本当に頭が上がりません;
ちなみに倉下は、問題は解決できないかもしれませんが一緒に考えることはできますので、それでも良いという方はお困りの際にご遠慮なくお声かけ頂ければと存じますm(_ _ )m
posted by 倉下 遼 at 16:01 | Comment(0) | Ren'Py

2019年01月08日

How to make a button to hide message window


I wanted to know how to make a button to hide the message window in Ren'py. I searched before but I could not find. However, he told me below.




Then, I could do it!
I also was helped before by him and Ren'py users on Twitter. I really appreciate them!!
posted by 倉下 遼 at 20:23 | Comment(0) | Ren'Py

2018年08月15日

nvlスクリーンの前に一瞬sayスクリーンが出るのを防止する


只今制作中のGreen Grassは小説スタイルなのでnvlモードを多用します。
それに当たり1つ困っていたのが、
nvlモードで文書を表示するとき、nvlスクリーンの前に
一瞬sayスクリーン(nvlモードでない方のメッセージウィンドウ)が
出てしまうという現象です。

解決方法としては、Option.rpyなどに
 define config.empty_window = nvl_show_core
 (又はinit pyshon:以下にconfig.empty_window = nvl_show_core)

を入れると良いようです。

詳細はこちら → NVL モード

途中でsayスクリーンを使いたくなったときは
$ config.empty_window = defaultを入れると良い様子?
(say_show_coreやadv_show_coreではないらしい)。確信はありません。
config.empty_windowの説明も見ましたがよくわかりません;


また、上記リンク先に記載のある「what_color」(キャラを定義する際に
キャラ名を表示させない代わりにキャラ別に文字色を指定する)
なども今回導入しました。


posted by 倉下 遼 at 23:03 | Comment(0) | Ren'Py

2018年07月07日

メインメニュー・Start()とJump()


前回投稿してからもう一ヶ月ですか、全くそんな感覚無かったのですが。早い。


Ren'py7が正式リリースされましたので…というよりは気まぐれで
Green Grassのメニュー画面を作ってます。
ここをしっかり作っておくことで調整・デバッグが楽になるので…というよりは
単にスクリプト打って作り込むの楽しいので。
たまにムシャッとなりますが。


今回は短編集なのでStartというラベルが無く、main menuから直接
各ラベルに飛ぶ仕様です。
GG_001.png

ここで困ったのが、何故か各ラベルにジャンプしてもquick_menuが表示されない。
かといって強引にmein_menuをスキップ(後述)して
mein_menuをstartラベルで呼び出すとmein_menu表示中にも
quick_menuが表示されてしまう。
他にもmein_menuのスクリーンが消えないとか
returnで意図しないところに飛んでしまうなどという問題が。

解決方法。
action Jump("xxx")を使ってmain_menuから各ラベルに飛んでいたのを
action Start("xxx")に変更しました。
これで意図通りに動いています。
StartとJumpの違いってよくわかってませんでしたが
こういうことだったんですね。


補足。
最近Ren'py日本語版ドキュメントの
スクリーンのアクション、値、関数」のページから
アクションの一覧が居なくなってしまいました(前はあった気がする)。
英語版だと健在です→「Screen Actions, Values, and Functions
他にも一部、英語版のみに記載されている内容があるようです。
編集中なのかもしれません。
そもそも翻訳してくださってる方が居るの有り難いです。



途中ですっ飛ばしたmain_menuの件。

label main_menu:
  return

とスクリプト内に打つとmain_menuの表示を飛ばしてstartラベル?に行けます。
中身に処理を入れることもできます。
詳しくはドキュメントの「特別なラベル」参照。
結局今回は使わずに済んだのですが。



おまけ。
メインメニューにビューポート(上下左右にスクロールできる窓)を入れました。
viewportの説明はRen'pyのチュートリアルがわかりやすいです
(ピンクの髪の女の子が説明してくれるアレです)。
「Screen Displayable」→「Viewport」です。

*
posted by 倉下 遼 at 06:52 | Comment(0) | Ren'Py

2018年01月19日

label中のpythonステートメント


すごい今更感ですが…

■ label中のpythonコード
Ren'pyスクリプトにPythonのコードを入れるときには
「init python」を使わなければいけないのかと思ったら
「python」でいいようでしたorz

・「python」:書いてあるところまで来るとコードを実行する
・「init python」:ゲームロード前の初期化時に実行する
(クラス、関数の定義やスタイル、設定変数、永続データの初期化などに使用)

これでラベル中に一行pythonやif文以外のpythonコードを
心置きなく入れられます。例えばこんなのとか。
label sample:
  python:
    a = 1


■配列の要素を一括で確認 → all()
追記ですが、pythonの「all」関数を使えば
配列の要素が全てTrueのときにTrueを返せるので
コンプリート判定などに便利そう、ということに気づきました。
いずれ機会があれば使いましょう。


■画像でボタンを作る(imagebutton)
普通にTEADで使っていた命令なのに忘れていたという…

imagebutton idle ★ hover △ action ○○

★や△には"画像パス"やDisplayableを入れます。
Solidやm.Scaleが便利。
○○にはボタンを押したときのアクションを入れるというのはいつも通り。

詳しくは公式マニュアルの「スクリーンとスクリーン言語
に掲載されています。
posted by 倉下 遼 at 19:56 | Comment(0) | Ren'Py

2017年09月08日

Ren'pyのNew GUI Interface


久々にRen'pyネタ。最近ちょっと触ったらUIというかシスグラというか
いい感じに進化していて虜になってしまいました。
デフォルトでもかなりセンスのいいUIになる上、カスタマイズしやすい。

難点はgui.rpyで諸々完結するのかと思いきや
screen.rpyをいじってやらないと変更できない箇所があったりする点です。

例えばnvlモードの文書の行間を変更したかったのですが
gui.rpyからでは設定できず、
screen.rpy内のstyle nvl_dialogue:に
「line_leading gui.nvl_text_line_leading」を追加し
gui.rpyに「define gui.nvl_text_line_leading = 12」
を追加したらできました。

クイックメニュー(メッセージウィンドウ下部に出てくるSave, Loadなどのボタン)
についてもボタンサイズなどはgui.rpyから設定できるのですが
表示位置を上下左右に動かすのはscreen.rpyから設定しました。
(screen quick_menu():)
大抵の設定はscreen.rpyがgui.rpyで指定した値を参照してますが
たまにそうでないのがある、といった感じでしょうか。

あとデフォルトでnvlモードの高さ指定
(gui.rpyのdefine gui.nvl_height)がありますが
長い分が続く文字が重なったりして面倒なので
これは=Noneにしてしまった方がわかりやすいかも。

「nvl clear」がexcepted statement(予期せぬ記述?)として怒られると思ったら
ファイル名の付け方に問題があったようで、
ファイル名の頭にwをつけました。
だいぶ前にも言及しましたが、恐らくrpyファイルがファイル名順に読み込まれていて
ユーザーが作成したrpyファイルが
option.rpyやscreen.pry(もしくはlabel startを含むscript.py?)より
先に読み込まれると不具合を起こすのだと思います。

最近になってはじめて、Launcher(ランチャー)の右下の
Preferences(設定)からランチャーを日本語で使えるということを知りました。
でもフォントが気に入らないのでやっぱり英語で使い続けます。
英語の勉強にもなるし。

posted by 倉下 遼 at 21:56 | Comment(0) | Ren'Py

2016年10月21日

エフェクトがすっ飛ばないようにする


自作品についてのご意見で
「日付(シーン)の変わり目でクリックすると即座に次のシーンに
 行ってしまい、変わり目がわかりづらい」
というお声を頂いていました。自分でも困ってました。
でもただのクリック待ちにすると今度は、クリックしないと画面が切り替わらない
という弊害が起きてしまいます。
クリックしても一瞬でとばず、クリックしなければ勝手に画面が変わるようにするには
どうしたらいいか。

「renpy.pause()」のカッコの中に変数を入れるとこの願いが叶うようです。

- - - - -
renpy.pause(delay=**, checkpoint=True)

delay:「**」に入れた秒数だけポーズする
checkpoint:
True ならチェックポイントが設定され、
プレイヤーはこのステートメントにロールバック出来る
- - - - -

delayを0以外にすればその分ポーズしてあとは勝手に進む。
そしてポーズ中にクリックしたとしても、チェックポイントがあるので…
言わばdelayで指定した秒数が経過したあとの画面で一瞬止まってくれます。
普通はクリックすると瞬時にメッセージが出てるシーン飛び、
ロールバックもメッセージウィンドウが出ているところにしか戻れなかったのですが。
テストプレイ後に実装した機能なので、これに起因する不具合が
もしかしたらあるかもしれません…。
自分でもテストはしたのですが、慌ててやってるとミスを拾いきれないこともあるので;


「TEAD」では、ロゴが表示されるところはdelayを指定し
日付替わりは完全なクリック待ちにしました。
日付替わりもdelayとチェックポイントの指定でも良かったかもですが;
posted by 倉下 遼 at 20:40 | Comment(0) | Ren'Py