少々ご質問がありましたので書いてみます。
目パチも口パクも ①アニメーションを定義 ②表示 しているという点は同じです。
口パクの場合は更に「喋ってる最中だけパクパクさせる」という制御を追加します。
使った画像
欲しい方はこちら → ダウンロード
(開発練習用素材同梱のpsdファイルから作っていますのでご自由にご利用いただけます。)
完成させた例
左下のサイドイメージに注目。
サンプルコード
Step 1
任意の.rpyファイルに以下を記入します。
## おまじない(口パク用)
init -1 python:
speaking = None
def while_speaking(name, speak_d, done_d, st, at):
if speaking == name:
return speak_d, .1
else:
return done_d, None
curried_while_speaking = renpy.curry(while_speaking)
def WhileSpeaking(name, speaking_d, done_d=Null()):
return DynamicDisplayable(curried_while_speaking(name, speaking_d, done_d))
def speaker_callback(name, event, **kwargs):
global speaking
if event == "show":
speaking = name
elif event == "slow_done":
speaking = None
elif event == "end":
speaking = None
speaker = renpy.curry(speaker_callback)
Step 2
任意の.rpyファイルで、必要に応じてキャラのcallback・アニメーション・表情差分を定義。
# キャラの定義に「callback=speaker(キャラ名)」を入れておく
define m = Character("芽衣", who_color="#bbddcc", image="may", callback=speaker("may"))
# サイドイメージの設定(目パチ・口パクとは無関係ですが一応掲載)
init python:
config.side_image_tag = "may"
# アニメーションの定義
image anime_may_e03:
"may_eye_edef"
pause 0.5
"may_eye_e01"
pause 0.1
"may_eye_e02"
pause 0.2
"may_eye_e01"
pause 0.1
repeat
image anime_may_m03:
"may_mouth_m01"
pause 0.2
"may_mouth_m02"
pause 0.2
repeat
# 表情差分の定義(レイヤー画像を使用する場合)
layeredimage side may:
always:
"may_body_bdydef"
group eye:
attribute edef default:
"may_eye_edef"
attribute e01:
"may_eye_e01"
attribute e02:
"may_eye_e02"
attribute e03: # 目パチ
"anime_may_e03"
group mouth:
attribute mddef default:
"may_mouth_mdef"
attribute m01:
"may_mouth_m01"
attribute m02:
"may_mouth_m02"
attribute m03:
# 口パクの指定 ... WhileSpeaking(キャラ名, 口パク画像, 口閉じ画像)
WhileSpeaking("may", "anime_may_m03", "may_mouth_m01")
always:
"may_heir_hdef"
# ※レイヤー画像を使わず、任意の名前で画像を定義しても構いません。
image may_animation_sample = "anime_may_e03"
Step 3
喋らせてみます。先ほどの動画のようになります。
(※下記の例では、動画に出ている背景・立ち絵の表示は省略しています。)
label start:
m e03 "おはよう。"
m e03 m03 "今日はどこに行こうか。"
ここでは1種類の目パチ・口パクしか定義していませんが、
お察しの通り(?)何種類かのアニメーションを用意して表情差分に割り当てることも可能です。
Extra
Step2でアニメーションを設定する際、「pause」のかわりに「choice」を使用すると目が開いている時間をランダムにすることができます(という情報をいただきました🙇♂️)。 下記の例では目が開いている時間が4秒・3秒・0.5秒のいずれかランダムになります。より自然な瞬きになるかと思います。
image anime_may_e03:
"may_eye_edef"
choice:
4.0
choice:
3.0
choice:
0.5
"may_eye_e01"
pause 0.1
"may_eye_e02"
pause 0.2
"may_eye_e01"
pause 0.1
repeat