見出し画像

Ren'Pyパーティクル祭り 〜雨、雪、火の粉、蛍から桜吹雪まで、スクリプトと素材を添えて〜

個人ゲーム開発者のみんなー! パーティクルは好きかー! 私は大好きだー! ただゲームに実装しようとすると難しい。自然に見えなくて白けたりするととても悲しい。

愛用のゲームエンジン「Ren'Py」(以下renpy)に実装されているパーティクル(スプライト)機能を使えば、簡単に雪とか降らせることはできる。

    image yuki = SnowBlossom("eff_snow1", count=50)

    show yuki

これだけで降る。簡単。しかし……。

序盤がワッサー降ってしまう。

と、いうわけで……以前プログラマさんから「このエフェクトって移植するの時間かかりそうですね」と言われ「画像と拡大縮小と回転と移動と透明度の変更しか使ってないよ」と答えたら驚いてもらえた(シェーダーとかプラグイン使ってると思ったらしい)経験から、無駄な自信をつけた私が! あらゆるrenpyパーティクルをできる範囲でいい感じにしたスクリプトとパーティクル画像をシェアします!

renpy使いの皆様におかれましては、丸々引用&適宜ご変更のうえお使いください。ただ著作権は放棄しないので、パーティクル画像の再配布は禁止です。

特にご利用報告やクレジットなど必要ありませんが、それはちょっと気が引けるという場合のみ、以下いずれかのようにお願いいたします。

-クレジットのスペサンとか素材提供に「みやこ出版」とご記載
-twitterなどのSNSで本稿をシェア
-renpyでゲームを作り良さを全方面へアピール


また、商用や賃金が発生するお仕事などにご利用いただいても構いませんがトラブルがあった場合の責任は負えませんのでご了承ください。

使い方の準備と基本

まず「renpy何もわからん」という状態の方は、以下一連の記事の最序盤のご一読ならびに「お試しキット」をDLのうえご利用ください。

本校でご紹介する「ええ感じと思われるパーティクルの基本」は、

  1. レイヤーを良い感じに並べておく

  2. 明滅、大小、濃度の変化、秒待ちなどTransformでニュアンス追加

  3. SnowBlossomでimageを作りFixedで奥&手前を作る

  4. 表示したいシーン(label start: 以降)で 3のimageをshowする

……ですが、これ「4」以外は何のことか分からなくても、以下のとおりベタ貼りすれば動きますのでご安心ください。ざっくり申しますと1〜3までは、いわゆる「ユーザー関数」のようなものを作り、showで呼び出す。とお考えください。

パーティクルを消すには hide を用いてください。image扱いなのでdissolveとかも使えるよ。

なお画面サイズ1920で調整しています。1280などに適応できるかどうかはちょっとわからないです!

ところで、以下ずーっと「eff」とか「effect」と表記してますが実際にはparticleですね……適宜なんとかしてご利用ください

下準備

以下の画像素材をダウンロードして、解凍しgameのimageフォルダに入れてね(macで圧縮してるから謎ファイルがついていると思うけど、これはコピーしないで捨ててください)。

下準備部分のスクリプト

どこに書いたらいいかよく分からん、という方は、label start: より前、もしくは他にeffect.rpy みたいなファイルを作ってそこにまとめて書くのが良いかと思います。


##まずdefineでキャラとパーティクル用のレイヤーを設定する
#ここにこのように書いておくと、毎回レイヤーを指定しなくて良くなる
define config.layers = ['master', 'eff_oku', 'char', 'transient', 'eff_mae', 'say', 'screens', 'overlay', 'confirm']

#すいません、もうちょっとスマートな書き方あるかもですけどわからなかったです
#立ち絵の奥と手前にエフェクトを流せるようにするためレイヤーを指定
define config.tag_layer = {"eff_rain":"eff_oku", "eff_snow":"eff_oku", "eff_hinoko":"eff_oku", "eff_hotaru":"eff_oku", "eff_hana":"eff_oku", "eff_rain_mae":"eff_mae", "eff_snow_mae":"eff_mae", "eff_hinoko_mae":"eff_mae", "eff_hotaru_mae":"eff_mae", "eff_hana_mae":"eff_mae",} 

#エフェクトここから#####################################
#countを増やすとパーティクルの数が増えるよ
### 雨
image eff_rain = Fixed(
    SnowBlossom("eff_rain1.png", count=120, xspeed=(0, 0), yspeed=(1000, 1200)),
    SnowBlossom("eff_rain2.png", count=100, xspeed=(0, 0), yspeed=(1200, 1400))) #数字を増やすと早く落ちるよ
image eff_rain_mae = SnowBlossom("eff_rain3.png", count=2, xspeed=(0, 0), yspeed=(1800, 2000))

### 雪
image eff_snow = Fixed(
    SnowBlossom("eff_snow1.png", count=25, xspeed=(-200, 200), yspeed=(100, 300), start=5),
    SnowBlossom("eff_snow2.png", count=20, xspeed=(-150, 150), yspeed=(50, 250), start=2))
    #よくわからないが最後にスタートとつけ少ない数にすると序盤でワッサー降らない
image eff_snow_mae = SnowBlossom("eff_snow3.png", count=5, xspeed=(30, 100), yspeed=(450, 550), start=2) #手前は早めに落としてます

### 火の粉
image eff_hinoko = Fixed(
    SnowBlossom("eff_hinoko1.png", count=10, xspeed=(250, 500), yspeed=(-120, -700), start=5),#下から上への動きはyをマイナスにおさめる? みたいです
    SnowBlossom("eff_hinoko2.png", count=7, xspeed=(500, 750), yspeed=(-70, -450), start=3))
image eff_hinoko_mae = SnowBlossom("eff_hinoko3.png", count=3, xspeed=(900, 1400), yspeed=(-700, -900), start=1) 


### 蛍############################################################
transform blink: #明滅させるアニメーション
    linear 0.0 alpha 0.0 zoom 0.7
    linear 1.0 alpha 1.0 zoom 1.0
    linear 0.7 alpha 0.0 zoom 0.7

    choice:# 明滅タイプを2種類作ってランダムで分けてます
        linear 0.8 alpha 1.0 zoom 0.9
        linear 1.5 alpha 0.0 zoom 0.4

    choice:
        linear 0.2 alpha 1.0
        linear 0.1 alpha 0.0
        linear 0.2 alpha 1.0
        linear 0.1 alpha 0.0
        pause 0.3

    repeat

image eff_hotaru= Fixed(
    SnowBlossom(At("eff_hotaru_1.png", blink), count=10, fast=True, yspeed=(-100, -200), xspeed=(-200,200), start=3),
    SnowBlossom(At("eff_hotaru_2.png", blink), count=5, yspeed=(150, 250), xspeed=(-100,400), start=2))

image eff_hotaru_mae = SnowBlossom(At("eff_hotaru_3.png", blink), count=3, yspeed=(-250, -350), xspeed=(200,500), start=1) 


### 桜吹雪############################################################
transform uramomote: #桜とか紙吹雪をチラチラ揺らす もう一枚くらいあるとさらに自然かも
    "eff_hana_1.png"
    choice:
        pause 0.1
    choice:
        pause 0.3

    "eff_hana_2.png"
    choice:
        pause 0.2
    choice:
        pause 0.4
    repeat


transform uramomote_l:
    "eff_hana_3.png" 
    choice:
        pause 0.3
    choice:
        pause 0.4

    "eff_hana_4.png"
    choice:
        pause 0.4
    choice:
        pause 0.6
    repeat

image eff_hana = Fixed(
    SnowBlossom("eff_hana_0.png", count=10, xspeed=(-50, -100), yspeed=(270, 400), start=3),
    SnowBlossom(At(uramomote), count=7, xspeed=(-150, -350), yspeed=(300, 500), start=2))
image eff_hana_mae = SnowBlossom(At(uramomote_l), count=5, xspeed=(-500, -700), yspeed=(350, 400), start=1)

#エフェクトここまで###########################################

以下は呼び出すスクリプトです。呼び出したいシーンにそのままコピペーすればOK。

    show eff_rain
    show eff_rain_mae

    show eff_snow
    show eff_snow_mae  

火の粉

    show eff_hinoko
    show eff_hinoko_mae 

    show eff_hotaru
    show eff_hotaru_mae 

桜吹雪

    show eff_hana
    show eff_hana_mae   

立ち絵表示のスクリプトの例

#立ち絵はレイヤーを指定しないとパーティクルが手前と奥に降らなくなります
    show girl onlayer char 
    with dissolve

パーティクルを消すスクリプトの例

    stop sound fadeout 2.0 #効果音をフェードアウト

    hide eff_hotaru #奥の蛍を隠す
    hide eff_hotaru_mae #手前の蛍を隠す
    scene bg_nohara #背景を消す 
    with dissolve #全部まとめてディゾルブ(フェード)


おまけ:降らない画面全体のキラキラ

こういうのも作ってみました。eff_twink.png という画像素材ご自分で用意してご利用ください。準備に貼る部分は以下の通りで、

image kira_all = Fixed(
    SnowBlossom(At("eff_twink.png", kirakira), xspeed=(0), yspeed=(0), count=7, start=1, fast=True),
    SnowBlossom(At("eff_twink.png", kirakira), xspeed=(0), yspeed=(0), count=7, start=1, fast=True),
    SnowBlossom(At("eff_twink.png", kirakira), xspeed=(0), yspeed=(0), count=7, start=0, fast=True))
    #降らせたい時はxspeedとかyspeedをいじる

### キラキラ#####################
transform kirakira:
    choice:
        align (1.0, 1.0)
    choice:
        align (0.0, 0.0)
    choice:
        align (0.5, 0.5)     

    alpha 0 #一旦透明度を挟んでサイズを選ぶ

    choice:
        zoom 1.0
    choice:
        zoom 0.8
    choice:
        zoom 0.6
    choice:
        zoom 0.4

    choice:
        linear 0.4 alpha 1.0
    choice:
        linear 0.6 alpha 1.0
    choice:
        linear 1.0 alpha 1.0

    linear 0.5 alpha 0.0

    repeat 

呼び出す部分は以下の通りです。人物手前に出す処理はやってません。思ったようにうまくバラけないのですがこだわりはいらんし大丈夫という方はご利用ください。

    show kira_all


お世話になっています/なりました

スクリプトのアドバイスをいただきました!


立ち絵素材をお借りしました!


背景素材をお借りしました!


効果音をお借りしました!


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