找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 134|回复: 3

[求助] 请问如何在游戏內任何可点按钮上都始终出现鼠标悬浮效果?

[复制链接]
发表于 2024-10-22 23:02:22 | 显示全部楼层 |阅读模式

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

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

×
之前根据大佬的教程设置了鼠标悬浮效果,但是只能在标题界面的“开始游戏”“读取游戏”这些button上实现,有可以在游戏内鼠标移至任意可以点击的分支选项时也出现悬浮效果的方法吗?
发表于 2024-10-23 05:54:52 | 显示全部楼层
你看的是哪个教程,不贴代码别人也很难跟进。。
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2024-10-23 11:48:47 | 显示全部楼层
本帖最后由 电波 于 2024-10-23 11:53 编辑
blackpineapple 发表于 2024-10-23 05:54
你看的是哪个教程,不贴代码别人也很难跟进。。

感谢回复!
教程:【renpy教程】定制鼠标光标的悬浮、按下和特殊效果
https://www.renpy.cn/forum.php?mod=viewthread&tid=1272
(出处: RenPy中文空间)

原教程提供的代码网址:https://github.com/libudu/renpy-mouse/tree/master

我本人是从代码网址中复制粘贴了mouse.rpy的部分,在screens.rpy中添加了mouse "mousehover"的代码,
我的mouse.rpy与添加的代码部分如下:
【mouse.rpy】
[RenPy] 纯文本查看 复制代码
define config.mouse = {
    'default': [
        ('mouse.png', 0, 0)
    ],
    'mousedown': [
        ('mousedown.png', 0, 0)
    ],
    'mousehover': [
        ('mousehover.png', 0, 0)
    ],
}

# renpy暂未提供鼠标按下时的定制接口
# 通过替换Interface中的原有方法来实现定制鼠标按下时的光标变化
init python:
    import pygame
    Interface = renpy.display.core.Interface

    def _mock_get_mouse_name(self, cache_only=False, interaction=True):
        global _old_get_mouse_name        
        if renpy.config.mouse.get("mousedown") != None and pygame.mouse.get_pressed()[0]:
            return "mousedown"
        return Interface._old_get_mouse_name(self, cache_only, interaction)
   
    # 先判断是否已存在,避免交互式编辑启动时会重载init python代码,导致递归
    if not hasattr(Interface, "_old_get_mouse_name"):
        Interface._old_get_mouse_name = Interface.get_mouse_name
        Interface.get_mouse_name = _mock_get_mouse_name   


# 使用transform做动态可视组件
transform MouseSnowTransform(last_time, rotate):
    im.FactorScale("mouse.png", 0.2)
    parallel:
        linear last_time alpha 0.0
    parallel:
        linear last_time rotate rotate

init python:
    # 下雪的鼠标
    import random
    class MouseSnow():
        def __init__(self):
            # 持续时间
            self.last_time = 1
            # 下落的可视组件
            self.snow_image_list = [
                MouseSnowTransform(self.last_time, 360),
                MouseSnowTransform(self.last_time, 180),
                MouseSnowTransform(self.last_time, -360),
                MouseSnowTransform(self.last_time, -180),
            ]
            # 下落区域的宽度
            self.snow_width = 50
            # 每隔多少秒生成一个
            self.break_time = 0.1
            # 下落速度
            self.speed_y = 1.5
            # 控制是否继续生成
            self.open = False

            # 同屏最大数量,等于持续时间/间隔生成时间
            self.max_count = self.last_time / self.break_time
            self.sprite_list = []
            self.sprite_manager = SpriteManager(update=self.sprite_update)
        
        # 粒子不断下落
        def sprite_update(self, st):
            for i in self.sprite_list:
                i.y += self.speed_y
            return 0.01
        
        # 生成一个粒子
        def add_sprite(self):
            if self.open:
                snow_image = random.choice(self.snow_image_list)
                sprite = self.sprite_manager.create(snow_image)
                mouse_pos = renpy.get_mouse_pos()
                sprite.x = mouse_pos[0]
                sprite.y = mouse_pos[1]
                sprite.x += random.random() * self.snow_width
                self.sprite_list.append(sprite)
                # 超过最大存在数则移除第一个
                if len(self.sprite_list) > self.max_count:
                    self.sprite_list.pop(0).destroy()
   
    mouse_snow = MouseSnow()
    # 光标雪花效果的置顶图层
    config.top_layers.append("mouse")

# 光标雪花效果的界面
screen MouseSnowScreen():
    layer "mouse"
    add mouse_snow.sprite_manager
    timer mouse_snow.break_time action mouse_snow.add_sprite repeat True

# 进入主菜单之前,开始显示鼠标界面
label before_main_menu:
    show screen MouseSnowScreen


【添加的代码】
[RenPy] 纯文本查看 复制代码
screen navigation():

    vbox:
        style_prefix "navigation"

        xpos gui.navigation_xpos
        yalign 0.5

        spacing gui.navigation_spacing

        if main_menu:

            textbutton _("开始游戏"):
                mouse "mousehover"
                action Start()

        else:

            textbutton _("历史"):
                mouse "mousehover"
                action ShowMenu("history")

            textbutton _("保存"):
                mouse "mousehover"
                action ShowMenu("save")

        textbutton _("读取游戏"):
            mouse "mousehover"
            action ShowMenu("load")

        textbutton _("设置"):
            mouse "mousehover"
            action ShowMenu("preferences")

        if _in_replay:

            textbutton _("结束回放"):
                mouse "mousehover"
                action EndReplay(confirm=True)

        elif not main_menu:

            textbutton _("标题菜单"):
                mouse "mousehover"
                action MainMenu()

        textbutton _("关于"):
            mouse "mousehover"
            action ShowMenu("about")

        if renpy.variant("pc") or (renpy.variant("web") and not renpy.variant("mobile")):

            ## “帮助”对移动设备来说并非必需或相关。
            textbutton _("帮助"):
                mouse "mousehover"
                action ShowMenu("help")

        if renpy.variant("pc"):

            ## 退出按钮在 iOS 上是被禁止使用的,在安卓和网页上也不是必要的。
            textbutton _("退出"):
                mouse "mousehover"
                action Quit(confirm=not main_menu)

回复 支持 抱歉

使用道具 举报

发表于 2024-10-24 09:19:32 | 显示全部楼层
可能楼主注意到了(也可能没注意到),标题界面 screen navigation 的文本按钮部分跟项目默认生成的有所不同,每个按钮都加了一条:
[RenPy] 纯文本查看 复制代码
mouse "mousehover"


所以,想要在分支选项上也有类似的效果,就需要修改对应界面的按钮。
一般在 screen.rpy 文件的 screen choice 中,略做修改:
[RenPy] 纯文本查看 复制代码
screen choice(items):
    style_prefix "choice"

    vbox:
        for i in items:
            textbutton i.caption action i.action mouse "mousehover"
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:20 , Processed in 0.112032 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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