忍者ブログ
はじかきれんしゅうちょう いろいろ
Admin  +   Write
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

タイトルから飛べて、ゲーム中のメニューからは飛べないおまけページのつけ方。
ゲーム中のメニューから飛べちゃうと戻すとき不都合があったので飛べなくしました。

<設定>
・エンドフラグを立てた後に増えるメニューである
・タイトルから飛べるがゲーム内のメニューからは飛べない
・「endroom」というラベルに飛ばす(これは例)

エンドフラグはスクリプトにかいとく。(persistent.●●
    $ persistent.finished = True

screens.rpyの## メインメニュースクリーンとゲームメニュースクリーン
から抜粋。


screen navigation():
    vbox:
        style_prefix "navigation"
        xpos gui.navigation_xpos
        yalign 0.5
        spacing gui.navigation_spacing
        if main_menu:
            textbutton _("はじめる") action Start()
            if persistent.finished:
                textbutton _("→おまけ等") action Start("endroom") #飛ばすラベル名
            
        else:
            textbutton _("ログ") action ShowMenu("history")
            textbutton _("記録する") action ShowMenu("save")
        textbutton _("続きから") action ShowMenu("load")


ここに足します。抜粋。
ログと記録するはゲーム中のメニューでだけ出現するっぽい。
つまり、elseブロックの中に独自な飛び先をいれれば
ステータス画面とかもできるんじゃないか説。
PR
ちょっとお休みで。

screens.rpyの# About(バージョン情報)スクリーン ########
のところ、(Ren'pyのライセンス云々が書いてある場所です)
微妙にスぺースがあまってるじゃないですか。ここに


screen about():
    tag menu
    ## 次の use ステートメントは game_menu(ゲームメニュー)スクリーンをこのスク
    ## リーンの内に表示しています。use 文の子(内包されたオブジェクト)の vbox
    ## は game_menu スクリーンの中の viewport に配置されます。
    use game_menu(_("情報"), scroll="viewport"):
        style_prefix "about"
        vbox:
            label "[config.name!t]"
            text _("Version [config.version!t]\n")
            ## gui.about は、通常 options.rpy で設定します。
            if gui.about:
                text "[gui.about!t]\n"
            text _("Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]")
            text _("\n\n【Thanks】\n{a=https://www.renpy.org/} ・リンク{/a}\n{a=https://www.renpy.org/} ・リンク {/a}\n{a=https://www.renpy.org/} ・リンク{/a}")
## 次の変数は about スクリーンにテキストを表示します。この変数は options.rpy で
## 再定義されるため、options.rpy の同じコードを消去しないと反映されません。
define gui.about = ""



こう足すと、リンク集ができます。
こんな感じ・・・


もちろんリンクは切ってなんか書くだけでもOK。
◇変数

変数は「$」。
 $ turn = 5 #代入。 
    $ hensu += 1  #今ある数字に足す ※

※なんでか【同じラべル内】で宣言してからじゃないとうまくきかなかったことがあった。
宣言=事前に    $ hensu = 0 を入れておくこと


また、マニュアルより文字列も入れられる。
セリフの中で出すときは[food] のように囲む。
    $ food = "アップルソース"
    "[food] でお願いします。" #セリフ

グローバル変数(クリアデータとかを管理できる)はpersistent.◯◯だそうです。
    $ persistent.finished = True

TrueとFalseもできるぞい。
これを使って、ifで分岐ができます。
persisitentの方のIFはなんか違う書き方するみたいなんで→ここを見てね。


【追記】あと、ifの時とかに使うであろう演算子。
renpyじゃなくてpythonで調べた時に出たやつだけど多分使えるはずなのでメモ。

###演算子
x > 0 #ゼロより大きければTRUE
x < y #xがyより小さければTrue
x <= y #xがyより小さいか等しければTrue

x > y #xがyより大きければTrue
x >= y #xがyより大きいか等しければTrue

x == y #xとyの値が等しければTrue
x != y #xとyの値が等しくなければTrue


◇変数による会話パターン分岐(IFをつかう)

 「共通ルートシナリオの中なんだけどもある場面でルートによって別のキャラがしゃべる」
 みたいな例です。要はフラグがあるときのみ聞ける会話みたいなのの発展?
 変数food0が1、2,3のときでif分岐してルート(に変数入れて)きまって、
 そのあとルートの変数でif分岐してセリフパターンで軽めに分岐して
 合流な流れのスクリプトが下の例です。(うーん説明になってなさげ)

 シナリオ抜粋なのでキャラ名とかそのまま・・・ノイズだと思いますがすみません。
 また、サンプルスクリプト内ではセリフ話者の指定とかは省いています。

#変数の数字によって別の変数に数字を入れときます。(ややこしい例になっちゃったな)
    if food0 == 1: #変数:food0は1でしょうか?
        $ route = 1  #ヒヤツグルート #変数:routeに1を入れる。
    elif food0 == 2: #それとも変数:food0は2でしょうか?
        $ route = 2 #フヨウルート #変数:routeに2を入れる。
    elif food0 == 3:  #それとも変数:food0は2でしょうか?
        $ route = 3  #リムファルート #変数:routeに3を入れる。
label pro17: #予選結果~★分岐あり
    scene bg06
    with fade 
    ns "予選課題の提出期間が終了しました。今日これから、再び集められた参加者の前で、結果が発表されます。"
  
    m1 "エントリーナンバー2!  フヨウ!"
    m1 "次! エントリーナンバー29! リムファ!"
    m1 "続いて! エントリーナンバー37!ヒヤツグ!"
    m1 "そして! 48番!"
    
    if route == 1:#ヒヤツグ
        m1 "肉への慈しみが感じられました! 歓喜の小籠包、ニオ!"
        ar "よし!"        
        hy "お、あの子だ。ニオって名前だったのか。"     
  
    elif route == 2:#フヨウ
        m1 "小麦へのこだわりが光りました! 万来の小籠包、ニオ!"
        ar "やったね!"     
        ng "あいつか……。なるほど、名前ぐらいは覚えておいたほうが\nよさそうだ。"

    elif route == 3:#リムファ
        m1 "香辛料の創意工夫が、懐かしくもハイセンス! \n革新の小籠包、ニオ!"
        ar "よかった! 予選突破だ!"     
        rm "ふーん、やるじゃない。あの子も予選通ったんだ。" 
 
label pro18: #説明
    m1 "以上! 名前を呼ばれた方で、本戦の材料費について補助を希望する場合は居残りをお願いします!"

すげ~~わかりにくいと思うんですが、
ルートに入る予定のキャラからひと言もらえるようなそんな感じになってます。
で、elifでインデントされた中までが終わったらlabel pro18 まで飛んでくれます。
それぞれ上からダーって再生されちゃう……みたいなことがないの。すごいね。

もちろんインデントの中にjumpを入れて別ラベルに飛ばせば普通に(?)
大掛かりな分岐もできます。
あっ、IF判定かけたい変数がIFんとこで初登場するとエラーになるので
スクリプト内にあらじめ使う変数を宣言しといてね。   

    $ food0 = 0 
    $ route = 0 
頭にでも。

※立ち絵については・26 ☆立ち絵差分表示(決定版)
を見たほうがいいです
(この記事は過去にいろいろ試してたやつの名残なので)


まとめです。
立ち絵差分……えっと、先に定義をするか

・①立ち絵フルファイル式
……差分を個別ファイルで全部まるごと用意するタイプ。
 →image ●●を使うといいと思う(やったことないけど)。

・②立ち絵差分顔面セット式
……表情の差分を、ベースと顔のセットで用意するタイプ。
  →image ●●を使う(横幅そのままで差分を切り出すことが必要)
  →im.Compositeを使う 

・③立ち絵差分ふくわらい式
……表情の差分を、べースとそれぞれ顔パーツで用意するタイプ。
  →im.Compositeを使う 


で、私は主に②でやっているのでそれを踏まえたお話というか
メモ書きになりますがというのを前提に、まとめ。

あといつも通り青がラベル外で、赤がラベル中の記述です。

image ●●を使うとき 
(試行錯誤
記事)→
差分チェンジ」 「立ち絵位置、拡大率

#名前と色と一緒にimageで指定します。「aa」で指定。
define k = Character('給仕', color="#c8ffc8", image="aa")

#キャラクター拡大率(必須ではない)1が現サイズ。
#立ち絵フルファイル式なら恩恵あるかも。差分やるときはわかんない。
image aa big = im.FactorScale("/stand/aa000.png", width=1)
image aa sm = im.FactorScale("/stand/aa000.png", width=0.4)


#立ち絵スムーズ表示スクリプト(必須ではない)
#alpchaは透明度で、linearは速さ?(小さくすると移り変わりが短くなる)
transform smooth:
    on show:
        alpha 0.0
        linear 0.5 alpha 1.0
    on hide:
        alpha 1.0
        linear 0.5 alpha 0.0

#表示します。(スクリプト)
#at topをつけると上からベースになっていい具合の位置に表示されるぜよ。

show aa sm at top

#立ち絵スムーズ表示スクリプトの恩恵を得たい場合は、「, smooth」をつけます。
show aa sm at top, smooth
________________

インデントはコピペするときに狂っちゃったから(ごめん)自分で直してね。
で、これでさらに②差分顔面セット方式で差分を変えるやり方。
差分は切り出すとき横幅と上からの距離をべース画像から変えないように。
具体的には試行錯誤記事参照です。
差分を表示するには↓


define ai = Character("アイリーン", image="ee") #タグ用ee とします。
image h00 = "/st_aa/aa000.png"  #eeではない指定外にべース画像を用意して定義します。
image ee h01 = "/st_aa/aa001.png" #eeの顔、その1としてh01
image ee h02 = "/st_aa/aa002.png" #eeの顔、その2としてh02で設定。
 
    show h00 at top #ベースを普通の画像として表示。
    show ee h01 at top   #差分画像を表示。座標はここがもとになるっぽいです。
    ai "「こんにちは!」"#eeの顔がh01でしゃべる。
 
  
    ai h02 "「……」"   #セリフを言わせながら差分をチェンジ。h02になる。




im.Compositeを使うとき
(試行錯誤記事)→
「顔差分VS私」「別のrpyで定義できる+高さ調節」
 「立ち絵を消したい」、「1シーン中に同じ顔が出せない?」

過去記事抜粋コピペします。こっちは座標が必要なのが特徴。
切り出しをベースと同じ大きさにするなら座標不要だけど、
どっちにしろなんでかベース画像の縦横サイズの記入が必要。
また、1個ずつ指定するのでコピペがめんどいかも?
(例だとtest1、test2となるような、青の塊をひたすら増やして定義が必要なので)

■② im.Compositeを使う+顔セット+座標指定あり
場所:身体→/images/test/body/b1.png

   顔→/images/face/te_ff.png

image test1 = im.Composite(
    (316, 600), #最終的なサイズ(身体パーツというかベースになる画像の縦横サイズです)
    (0, 0), "/test/body/b1.png", #身体パーツ
    (114, 54), "/test/face/te_ff.png") #顔セットパーツ   

    show test1 
_______________________

■③、 im.Compositeを使う+(顔パーツ複数構成+特殊パーツも)+座標指定あり
 →②を応用してパーツを細かくしてみた版です。
場所:身体→/images/test/body/b1.png
   目→/images/face/te_m1.png
   口→/images/face/te_k1.png
   特殊→/images/face/te_oko.png (怒りマークをつけてみます)

image test1 = im.Composite(
    (316, 600), #最終的なサイズ
    (0, 0), "/test/body/b1.png", #身体パーツ
    (111, 63), "/test/me/te_m1.png", #目パーツ
    (122, 106), "/test/kuchi/te_k1.png", #口パーツ
    (153, 27), "/test/parts/te_oko.png") #表情パーツ

    show test1
※立ち絵については・26 ☆立ち絵差分表示(決定版)
を見たほうがいいです
(この記事は過去にいろいろ試してたやつの名残なので)


●やっぱり名残惜しいんで考えてみた差分チェンジ方式。
用意してあるのはベース画像と、座標指定で使う用に切り抜いた顔差分。

①公式のここを見ます。→ 立ち絵の表情を切り替える

組んでみます。
define ai = Character("アイリーン", image="ee") #タグ用ee とします。
image h00 = "/st_aa/aa000.png"  #eeではない指定外にべース画像を用意して定義します。
image ee h01 = "/st_aa/aa001.png" #eeの顔、その1としてh01
image ee h02 = "/st_aa/aa002.png" #eeの顔、その2としてh02で設定。
 
    ns "京尭31年、農村部ーー"
    show h00 at top #ベースを普通の画像として表示。
    show ee h01 at top   #差分画像を表示。座標はここがもとになるっぽいです。
    ai "「こんにちは!」"
 
    # 立ち絵を eileen concerned に切り替える
    # e には eileen イメージタグが関連づけられているので、ここで eileen concerned が表示される
    ai h02 "「……」"   #セリフを言わせながら差分をチェンジ。


はいズレます (画像は一例)




ということで小さいほうの(切り替える)画像について位置指定を作って
ちみちみ揃えていきます。


transform top2:  
#transform ●●で show at●● と位置が対応するよ。
    ypos 0.1   #上下位置
    xpos 0.5     #左右位置

と思ったけど無理!!
せめて左上ぞろえで書き出しておかないと無理!!!

揃えてもダメでした。
→じゃーとおもって左上+横幅をそろえたらこれはいけました。

つまり、立ち絵の切り替えは
①ひたすらshowとかhideする (以前の記事、立ち絵バトル1~3)
②切り出し差分チェンジキャラ指定(今回の記事)
の方法があり(いや他にもあるかもだが)

②の場合は差分切り出しを横幅そのままで切ること。
つまり、こういうベースに対して



 ←これは×(ずれる)

 ←これは〇
(上からの距離と横幅をベース画像と同じにする)

そんな感じです。

こっちの方法のほうがすっきりはするけどスクリプトがどうかな。
名前指定の部分は置換でタグにしてるから、あまりいじりたくないんだよね。
変な半角とか入ると途端にエラーがでちゃうので、なるべく機械的に
サクっと置換で終わらせたいのだ。
顔差分を指定するとなると手でポチポチしないといけないじゃん??
(ゲーム画面見ないとイメージがわかないタイプなのでシナリオ書きながら指定する気はない)

置換について>
シナリオ中に例えばキャラ名「クマ」なら
クマ「セリフ~~~」ってシナリオに書いたとして、スクリプトにするとき
    ai "「セリフ~~~」"
にする必要があるから、
クマ「 →    ai "
」 →
みたいに変換しているのです。説明難しい


ちょっとまたこんど加筆かも。


≪ 前のページ   *HOME*   次のページ ≫
ブログ内検索
このブログについて
ゲーム作りたい人のメモ。
講座というほどのものでもないおぼえがきです。
何か参考になるところがあればご自由にどうぞ。
ほぼ自分用なので、日本語いきあたりばったりでごめんなまし。

※ここに書いたことは全体的に
「本当はなんとかする方法があるかもしれないけど、私にはわからない」が多く…
あんまり仕組みを理解していないし誤解もあるかもしれません。
というわけで責任は負いません。ごめんなさい!

リンク:ゲーム作ってる本館
material by bee  /  web*citron
忍者ブログ [PR]