見出し画像

非プログラマのRen'Pyノート:スクリプト応用編

何回も使う長めのスクリプトはひとつ作って呼び出しだけする方法が役に立ちます。いわゆる「ユーザー関数」「マクロ」とか呼ばれるやつですね。

いや別に、動きさえすれば同じスクリプトを何度書いても、長くなってもいいんじゃない? と、ゲームを作り始めた当初は思っていました。しかし、プログラマさんたちと一緒に仕事をしてみると分かるのですが、短く・綺麗にスクリプトを書くことは結果としてバグを減らし、開発生命を穏やかに長く保つ一助となります

例えばRen'Pyでは、メッセージ話し手の表示方法が最初から簡易化できるよう作られています。しかし、使い始めはちょっと分かりにくいので、コピペ用スクリプトを用意しました。

その他、if(条件分岐式)や変数を使った分岐の流れなど、アドベンチャーやシミュレーションに使えそうな一連のスクリプトもご紹介します。

本稿はrenpy触って少〜し分かり始めた方向けです。初めてで何もわからん方は過去記事からご覧いただくとスムーズに進められるかも知れません


define+呼び出しの基本

defineは、ユーザー関数とはちょっと違うっぽく、自分は「よく使いがちなユーザー関数をrenpy側が超短く用意してくれてるので、ルールに乗っ取って借りる」とか「作中では変化しない文字や数を代入しておく」という理解でいます。

2023年4月追記:defineは作中で変化する変数には使用しないとご指摘をいただきましたので関連する表記を修正しました

例えばキャラ(話し手)の定義はこんな感じ。このdefineは文頭を空けなくてokだし、別のファイルに書いても呼び出せます。

#キャラの定義。セリフを喋る時に使う
define nk = Character('ねこ', color="#303030")#このcolorはキャラの文字色
define sh = Character('シャツの人', color="#303030")
define co = Character('コートの人', color="#303030")
define nar = Character(name=None, kind=nvl) #全画面テキスト表示
define me = Character('わたし', window_yalign=0.1) #ウィンドウ位置が画面上部になる

#呼び出し例
label aaa:
    sh "こんにちは。シャツの人です。"
    co "どうも。コートの人です。"
    ne "にゃーん。"
    nar "突然の全画面方式で表示されますよ。"

例えばキャラの立ち位置とか毎回数字を入れるのが大変なので、よく使うのはこんな感じで「位置」を指定して使うと便利。

# 位置を定義します(デフォルトの右左はキャラがめっちゃ離れるので)
# 微調整したいときはxpos=0.65 にするとか色々試してみてね
# yanchor=1.0 で、下揃えになってます 0にすると上揃えになるよ
define r = Position(xpos=0.7, xanchor=0.5, ypos=1.0, yanchor=1.0)
define l = Position(xpos=0.3, xanchor=0.5, ypos=1.0, yanchor=1.0)

#キャラを位置指定して呼び出し
label bbb:
    show yyy at r
    sh "右のほうにキャラを表示したよ。"

imageは色ベタの定義なんかもできます。これは便利。

##色ベタ 好きな名前と色を定義して使えます###################
image color_wht = Solid("#ffffff")
image color_blk = Solid("#000000")
image color_red = Solid("#9a2626")

#色ベタを呼び出すよ
label ccc:
    show red with dissolve

ここに貼ってると表示されませんが、Visual Studio Code+Ren'Py用プラグイン? と正しく連携できていれば、本記事タイトルのスクショ状に色見本が表示されます。

label+call呼び出しの基本

長い演出とかは一つ作っておけば何度でも1行くらいで呼び出せます。これが、他のゲームでいうところの「ユーザー関数」や「マクロ」と同じことと思われます。

1.label〜returnで演出を作る
2.callで呼び出す

### キラキラ#####################
image twink1 = "eff_twink.png"
image twink2 = "eff_twink.png"
image twink3 = "eff_twink.png"
image twink4 = "eff_twink.png"

label eff_twink:
    show twink1 with dissolve:
        xalign 0.56 #左右の場所を変更したいときはここの数を変える(〜1.0まで)
        yalign 0.35 #上下の場所を変更したいときはここの数を変える(〜1.0まで)
        linear 0.7 alpha 1.0
        linear 0.7 alpha 0.0
        repeat #repeat の後に、3とか書くと「3回繰り返したら終わる)       

    show twink2 with dissolve:
        xalign 0.58 #左右の場所を変更したいときはここの数を変える(〜1.0まで)
        yalign 0.42 #上下の場所を変更したいときはここの数を変える(〜1.0まで)
        zoom 0.7 #これはサイズ 1.0=100%
        linear 0.5 alpha 1.0 #linear時間かけて、透明度alphaを変更
        linear 0.5 alpha 0.0
        repeat  

    show twink3 with dissolve:
        xalign 0.42 #左右の場所を変更したいときはここの数を変える(〜1.0まで)
        yalign 0.58 #上下の場所を変更したいときはここの数を変える(〜1.0まで)
        zoom 0.9 #これはサイズ 1.0=100%        
        linear 0.7 alpha 1.0 #linear時間かけて、透明度alphaを変更
        linear 0.7 alpha 0.0
        repeat 

    show twink4 with dissolve:
        xalign 0.5 #左右の場所を変更したいときはここの数を変える(〜1.0まで)
        yalign 0.5 #上下の場所を変更したいときはここの数を変える(〜1.0まで)
        zoom 0.6 #これはサイズ 1.0=100%
        linear 0.5 alpha 1.0 #linear時間かけて、透明度alphaを変更
        linear 0.5 alpha 0.0
        repeat          
    return

label dlt_eff_twink: #これはきらきらをまとめて消すだけのやつ
    hide twink1
    hide twink2
    hide twink3
    hide twink4
    with dissolve
    return    

#################################
label ddd:
    call eff_twink #この一行で文字送りを何回でも呼べるよ
    "きらきらしてるはずだよ"

    call dlt_eff_twink

if節(分岐)と変数サンプル

renpyでは、変数の代入はかなり簡単に書けます。

$ count_talk += 1 

なんかこんな感じ。

しかし! renpyには割と難しい決まりがあり、

1.変数は使うまえに仮数字を入れておく必要がある(多分)
2.この仮数字の定義を、実際に使う場所より前に通る必要がある
3.2に関しては、どうもアルファベット順に通ってるらしい

なので、例えばdefine.rpyというファイルに変数をまとめて書いたとして、april.rpyみたいな「アルファベット昇順」で先に読まれるファイルで変数を使おうとする場合、エラーが生じる可能性がある? みたいな感じ? 実は私もちょっとよく分かっておりません。しかしともかく、変数系でなんかエラーが出たらまずこれを疑うと良いかも知れません。

何言ってるのかちょっとわからないです。とにかく動けばいいんです。という方は、「label start: の直後に変数 $ の代入をまとめて入れとく」と間違いはないと思います。

#変数は使うまえに仮数字を入れて定義しておく必要があるよ
#この仮数字の定義を、実際に使う場所より前に通る必要がある
$ count_talk = 0
    
label before_menu:

## 選択肢関係ここから###########################################################
    # 選択肢はmenu:で表示 この間なんも受け付けんので効果音の変更とかは選択後でないと無理
    # 選択時の効果音を変更したい場合は、###########################################
    menu:
        ne "にゃーん?"

        "あいさつする":
            ne "こんにちは"    
            # $ で「変数」を使えます
            # 変数は「ありなし判定」とか「数字をカウント」する箱を作るようなものです
            # 仮に「不可算」と「可算」変数とします。実際はそう呼ばないと思います、本作者の造語です
            # まず「不可算」変数を使ってみましょう。
            # 「話した」talkという実績を解除した、みたいなことです。
            $ talk = True

            #さらに「何回話した」という変数もカウントしてみます。好感度とかお金に使えますね。
            #何度も挨拶するとどうなるか、下に続くifに色々書いておきます。
            $ count_talk += 1 

            sh "やあやあ。どうも。"
            jump after_menu

        "あいさつしない":
            ne "…………。"
            sh "無視かい。"
            # チュートリアルの都合上、選択肢の直前に戻ります。
            jump before_menu


## 選択肢関係ここまで###########################################################


label after_menu:
     "選択肢が終わりましたね"


## 変数を用いた条件分岐式ここから#################################################
## if判定を入れます。if 〜: で、〜というフラグがtrueの時。という意味になるよ。
## ifの後は、文字送りを間違ってエラーがでがちなのでご注意ください(emptyだよと怒られる)
## if文は上から判定されるので、順番にも注意です

    if count_talk == 3:
        "3回も挨拶したので、挨拶回数をリセットします。"        
        $ count_talk = 0

    elif count_talk > 0:
        "[count_talk]回挨拶しましたね"        

    elif talk:
        "さっきあいさつしましたよね。"

    else:
        "さっきあいさつしてないですよね。"

## 変数を用いた条件分岐式ここまで#################################################

    "if判定を終わりました。選択肢表示前に戻りましょう。"
    window hide

    jump before_menu

renpyの四則計算サンプル

代入と四則計算の例も載せておきます。

$ keisan = 0
$ moe = 0

label start:

    $ moe = 5
    "数字の代入をしたよ。moeは[moe]です。"

    $ keisan = moe + 3
    "足し算の計算結果は[keisan]です"

    $ keisan = moe - moe
    "引き算の計算結果は[keisan]です"

    $ moe += 2
    "2を足したので、今moeは[moe]です。=+と書くと足されないので注意だ。"

    $ keisan = moe * 5
    "掛け算の計算結果は[keisan]です"

    $ keisan = moe / 4
    "割り算の計算結果は[keisan]です"

    return

ほんで「その数字を増やしたり減らすのはわかったけど、それを体力とか好感度にして表示する方法は?!」と思われるかも知れません。わかる。わかりますけどそこのチュートリアルまで作るの割と大変なのと、需要どのくらいあるかわからないし、いいねとかコメントいただけると目安になりますのでよろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?