Ren'Pyパーティクル祭り 〜雨、雪、火の粉、蛍から桜吹雪まで、スクリプトと素材を添えて〜
個人ゲーム開発者のみんなー! パーティクルは好きかー! 私は大好きだー! ただゲームに実装しようとすると難しい。自然に見えなくて白けたりするととても悲しい。
愛用のゲームエンジン「Ren'Py」(以下renpy)に実装されているパーティクル(スプライト)機能を使えば、簡単に雪とか降らせることはできる。
image yuki = SnowBlossom("eff_snow1", count=50)
show yuki
これだけで降る。簡単。しかし……。
序盤がワッサー降ってしまう。
と、いうわけで……以前プログラマさんから「このエフェクトって移植するの時間かかりそうですね」と言われ「画像と拡大縮小と回転と移動と透明度の変更しか使ってないよ」と答えたら驚いてもらえた(シェーダーとかプラグイン使ってると思ったらしい)経験から、無駄な自信をつけた私が! あらゆるrenpyパーティクルをできる範囲でいい感じにしたスクリプトとパーティクル画像をシェアします!
renpy使いの皆様におかれましては、丸々引用&適宜ご変更のうえお使いください。ただ著作権は放棄しないので、パーティクル画像の再配布は禁止です。
使い方の準備と基本
まず「renpy何もわからん」という状態の方は、以下一連の記事の最序盤のご一読ならびに「お試しキット」をDLのうえご利用ください。
本校でご紹介する「ええ感じと思われるパーティクルの基本」は、
レイヤーを良い感じに並べておく
明滅、大小、濃度の変化、秒待ちなどTransformでニュアンス追加
SnowBlossomでimageを作りFixedで奥&手前を作る
表示したいシーン(label start: 以降)で 3のimageをshowする
……ですが、これ「4」以外は何のことか分からなくても、以下のとおりベタ貼りすれば動きますのでご安心ください。ざっくり申しますと1〜3までは、いわゆる「ユーザー関数」のようなものを作り、showで呼び出す。とお考えください。
パーティクルを消すには hide を用いてください。image扱いなのでdissolveとかも使えるよ。
なお画面サイズ1920で調整しています。1280などに適応できるかどうかはちょっとわからないです!
下準備
以下の画像素材をダウンロードして、解凍し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
お世話になっています/なりました
スクリプトのアドバイスをいただきました!
立ち絵素材をお借りしました!
背景素材をお借りしました!
効果音をお借りしました!
この記事が気に入ったらサポートをしてみませんか?