找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 102|回复: 0

[教程] 高级角色详解

[复制链接]
发表于 2024-5-5 01:57:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 ZYKsslm 于 2024-5-5 17:27 编辑

高级角色详细教程

最近在RenPyUtil项目上获得了一些使用反馈,故而专门写个帖子来详解一下 advanced_character 模块。

在使用前,请确保你的 game 目录中已存在 RenPyUtil 包或 advanced_character_ren.py 文件




                               
登录/注册后可看大图



类一览
描述
CharacterTask
角色任务类,用于创建高级角色对象所绑定的角色任务
AdvancedCharacter
继承自ADVCharacter的高级角色对象,在原有角色对象基础上添加了更多高级方法
CharacterGroup
角色组,用于管理多个高级角色对象
SpeakingGroup
继承自角色组的对话组,用于让组内高级角色支持强调发言(明暗显示)


注意:所有方法均已省略 self 参数

角色任务 CharacterTask 方法一览
方法名
描述
__init__(single_use=True, **attrs)

初始化一个任务
add_func(func, *args, **kwargs)
绑定一个函数


高级角色 AdvancedCharacter 方法一览


方法名
描述
__init__(name=None, kind=None, **properties)
初始化方法
add_task(task)
绑定一个角色任务
add_attr(**attrs)
创建自定义属性
set_attr(attr, value)
修改一个自定义属性的值
get_customized_attr()
返回包含自定义属性的字典

角色组 CharacterGroup 方法一览


方法名
描述
__init__(*characters)
初始化方法
add_characters(*characters)
添加高级角色对象
get_random_character(rp=True)
返回角色组中随机一个对象
del_characters(*characters)
删除角色对象
add_group_attr(**kwargs)
向所有对象添加属性
set_group_attr(attr, value)
改变所有对象的属性
set_group_func(task)
给所有角色添加任务

对话组 SpeakingGroup 方法一览(继承自CharacterGroup,省略父类方法)


方法名
描述
__init__(*characters, t=0.15, l=-0.3)
初始化方法
add_characters(*characters)
添加高级角色对象




对话组使用


经过更新,高级角色对象使用对话组将会更加方便,这里使用高级角色对象演示


我们先定义几个高级角色对象和对应立绘,并加上 image 参数表示角色对应的立绘图像标签名


[RenPy] 纯文本查看 复制代码
default a = AdvancedCharacter(
    "Alice", 
    image="alice",  # 绑定相应角色的立绘图像标签
)

default m = AdvancedCharacter(
    "Mary",
    image="mary",
)

default s = AdvancedCharacter(
    "Sylvie",
    image="sylvie",
)

# 定义角色不同表情的立绘
image alice blush = "images/Alice_VNSpriteSet/Alice_Blush.png"
image alice default = "images/Alice_VNSpriteSet/Alice_Default.png"
image alice worried = "images/Alice_VNSpriteSet/Alice_Worried.png"
image alice doubt = "images/Alice_VNSpriteSet/Alice_Doubt.png"

image mary angry = "images/Sprite - Female Pink Hair Starter Pack/Sprite F PinkH Professional Angry01.png"
image mary smile = "images/Sprite - Female Pink Hair Starter Pack/Sprite F PinkH Professional Smile01.png"

image sylvie smile = "images/Sprite Starter Pack - Female White Hair/FWH smile01.png"
image sylvie angry = "images/Sprite Starter Pack - Female White Hair/FWH angry01.png"



然后我们需要将所有角色对象加入一个对话组中


[RenPy] 纯文本查看 复制代码
# 定义一个对话组
default speaking_group = SpeakingGroup(a, m, s)



最后就可以直接在游戏中使用


[RenPy] 纯文本查看 复制代码
label start:
    scene bg:
        xysize (1920, 1080)
        truecenter

    # 将角色加入对话组中
    #$ speaking_group.add_characters(a, m, s)

    a "Hello, my name is Alice. How can I help you today?"

    show alice blush:
        zoom 0.65
        center
    
    a "a"
    a @ default "a default"

    show mary angry:
        zoom 0.7
        left

    m "m"
    m @ smile "m smile"

    show sylvie smile:
        zoom 0.65
        right

    s "s"
    s @ angry "s angry"

    a "return to a"

    m "return to m"

    # 当需要移除角色时(一位角色离场)
    $ speaking_group.del_characters(s)
    hide sylvie

    "Sylvie left."

    m "She has left now."
    a "This is our turn."
 
    return



当不需要再显示角色立绘时可以将角色从对话组中移除


[RenPy] 纯文本查看 复制代码
# 当需要移除角色时(一位角色离场)
    $ speaking_group.del_characters(s)



高级角色对象和角色任务

高级角色对象应使用 default 语句定义,传参与普通角色一致


[RenPy] 纯文本查看 复制代码
default e = AdvancedCharacter("艾琳", what_color="#FF8C00", who_color="#00CED1")



使用 add_attr 方法可以给对象添加自定义属性(如好感度,健康值等)


[RenPy] 纯文本查看 复制代码
 # 高级角色增添属性
        e.add_attr(love_point=50)
        e.add_attr(strength=100, health=40)



我们可以创建一个角色任务来监测自定义属性的值以触发相应的函数


[RenPy] 纯文本查看 复制代码
# 创建一个角色任务
        love_task = CharacterTask(single_use=True, # single_use参数若为True则该任务为一次性任务
            love_point=100,
            health=50,
        )



若single_use 参数若为True,当任务触发一次后自动移除该任务。其他关键字参数则为监测的自定义属性与预期触发值

现在需要使用 add_func 方法给角色任务绑定触发的函数


[RenPy] 纯文本查看 复制代码
love_task.add_func(love_event, e, name="ZYKsslm")



方法的第一个参数为要绑定的函数,其他参数则为该函数的参数


接下来需要使用 add_task 方法让角色添加角色任务


[RenPy] 纯文本查看 复制代码
e.add_task(love_task)



然后只需更新角色的自定义属性的值,当所有被监测的属性达到预期触发值则执行对应函数


[RenPy] 纯文本查看 复制代码
        e.love_point += 50
        e.health += 10



若需要函数的返回值,我们可以通过角色任务的 func_return 属性(一个字典)获取到返回值


[RenPy] 纯文本查看 复制代码
# 获取任务函数返回值
        recieve = love_task.func_return["love_event"]



键为需要获取返回值的函数名


完整代码


[RenPy] 纯文本查看 复制代码
init python:
 
 
    # 一个任务函数
    def love_event(speaker, name):
 
        speaker(f"{name}, I love you.")
        recieve = renpy.input("So, your answer is......")
 
        return recieve

    # 使用threading_task装饰的函数将在子线程中运行
    @threading_task
    def thread_event():
        renpy.notify("Messages")
 
 
# 使用default语句定义高级角色对象
default e = AdvancedCharacter("艾琳", what_color="#FF8C00", who_color="#00CED1")
 
 
# 游戏在此开始。
 
label start:
 
    python:
        # 高级角色增添属性
        e.add_attr(love_point=50)
        e.add_attr(thread=False)
        e.add_attr(strength=100, health=40)
 
    # 输出角色所有的自定义属性及其值
    e "[e.customized_attr_dict!q]"
 
    python:
 
        # 创建一个角色任务
        love_task = CharacterTask(single_use=True, # single_use参数若为True则该任务为一次性任务
            love_point=100,
            health=50,
        )

        thread_task = CharacterTask(False, thread=True)

        # 绑定任务函数
        love_task.add_func(love_event, e, name="ZYKsslm")
        thread_task.add_func(thread_event)

        # 绑定角色任务
        e.add_task(love_task)
        e.add_task(thread_task)
 
        e.love_point += 50
        e.health += 10

        e.thread = True
 
        # 获取任务函数返回值
        recieve = love_task.func_return["love_event"]
    
    if recieve:
        e "Your answer is '[recieve!q]'"
 
    return


评分

参与人数 1活力 +300 干货 +3 收起 理由
被诅咒的章鱼 + 300 + 3 感谢分享!

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-5-19 14:44 , Processed in 0.081044 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表