找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1766|回复: 3

[经验] Tooltip进阶-用于更好的在鼠标位置显示提示文本或菜单

[复制链接]
发表于 2021-12-1 13:48:44 | 显示全部楼层 |阅读模式

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

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

×
如题,关于可视化音乐以及游戏内渲染图表一类之后看情况可能考虑GitHub开源试试,目前正在写音乐室的歌词导入,大体完工,不能正常导入日韩歌词以及时间轴可能会出现许多莫名其妙的bug可能之后会在群里找大佬们问问技术相关的问题orz

首先是主体:
[RenPy] 纯文本查看 复制代码
init python:

    class MouseTooltip(renpy.Displayable):

        def __init__(self, **kwargs):
            super(renpy.Displayable, self).__init__(**kwargs)
            self.text = Text("")
            self.textsize = 18
            if music_room == False:
                self.textcolor = Color("#D3D3D3")
            else:
                self.textcolor = Color("#000000")
            self.padding = 0
            self.bold = False
            self.backgroundcolor = Color("#000000", alpha=0)
            self.x = 0
            self.y = 0

        def render(self, width, height, st, at):
            ## 避免在清除文本时渲染空矩形
            if self.text.text != [""]:
                w, h = self.text.size()
                render = renpy.Render(w, h)

                ## 确保tooltip靠近屏幕边缘的时候还能正常显示在屏幕上
                x = self.x + self.padding
                else:
                    x = self.x - self.padding -12
                if x > config.screen_width - w - self.padding:
                    x = config.screen_width - w - self.padding

                y = self.y-h-self.padding*2 ## -h会将将文本放置在鼠标上方,+h反之
                if y < 0:
                    y = 0

                fixed = Fixed(self.backgroundcolor, xpos=-self.padding, xsize=int(w)+self.padding*2, ysize=int(h)+self.padding*2)
                fixed.add(self.text)
                render.place(fixed, x, y)
                return render
            return renpy.Render(1, 1)

        def event(self, ev, x, y, st):
            import pygame
            ## 忽略除“MOUSEMOTION”之外的所有事件
            if ev.type != pygame.MOUSEMOTION:
                return None
            self.x = x
            self.y = y
            tooltip = GetTooltip()
            if tooltip:
                self.text = Text(tooltip, size=self.textsize, color=self.textcolor, xpos=self.padding, ypos=self.padding, bold=self.bold, font="/fonts/NotoSansHans-Regular.otf")
                renpy.redraw(self, 0)
            elif self.text.text != [""]: 
                ## 避免不必要的重绘
                self.text = Text("") 
                ## 只清除一次文本
                renpy.redraw(self, 0)

define mousetooltip = MouseTooltip()


相比原本的tooltip能够更好的应用在一些图像模块上(可用于图像数值菜单)
这里有个简单的调用实例:
[RenPy] 纯文本查看 复制代码
vbox:
        style_prefix "navigation"

        xalign 0.145
        yalign 0.93

        frame:
            background None
            padding (0, 0, 0, 0)
            imagebutton:
                idle im.MatrixColor(gui.button_url, im.matrix.colorize('#a9a9a9dd', '#dcdcdcdd') * im.matrix.opacity(0.95), xalign=0.5, yalign = 0.5)
                hover im.MatrixColor(gui.button_url, im.matrix.colorize('#dcdcdcdd', '#a9a9a9dd') * im.matrix.opacity(0.55), xalign=0.5, yalign = 0.5)
                # foreground "URL_button_text"
                at main_menu_url_hover
                activate_sound "audio/Menu/g_ui_confirm.wav"
                hover_sound "audio/Menu/g_ui_btn_n.wav"
                if URL.user_networking == True:
                    if URL.user_Draw_renpy == 1:
                        action [Function(URL.check_Orientation_Jump),Function(Draw.Webpage.auto_in_renpy)]
                    else:
                        action [Function(URL.auto_Orientation_Jump)]
                    if URL.user.Draw_renpy == 1:
                        tooltip "显示官网 (可能会占用大量资源)" ## if不是必要的,可以去掉
                    else:
                        tooltip "跳转官网"
            at main_menu_button_floor(0.3)
            ## 必要部分
            $ tooltip = GetTooltip()
    if tooltip:
        timer 0.001 action SetVariable("tt_timer", True)
        if tt_timer:
            add MouseTooltip()
            $ mouse_pos = renpy.get_mouse_pos()
            $ renpy.set_mouse_pos(mouse_pos[0], mouse_pos[1])
    else:
        timer 0.001 action SetVariable("tt_timer", False)



简单示例

简单示例

评分

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

查看全部评分

 楼主| 发表于 2021-12-1 13:51:00 | 显示全部楼层
疏忽了,第9行那个music_room,if记得去掉
回复 支持 抱歉

使用道具 举报

发表于 2021-12-2 10:11:54 | 显示全部楼层
想知道“可视化音乐”方面的设计思路是啥样的……
回复 支持 抱歉

使用道具 举报

 楼主| 发表于 2021-12-3 06:59:27 | 显示全部楼层
被诅咒的章鱼 发表于 2021-12-2 10:11
想知道“可视化音乐”方面的设计思路是啥样的……

【最基础的思路】关于可视化音乐的构建是1年前开始的(结合pygame和https://lemmasoft.renai.us/forums/viewtopic.php?f=51&t=60318),这位大佬的方案在当时的预览版7.4以及现在的7.5.0已经不能良好运作,所以重新给renpy定制了一个专属库,目前bug还是比较多需要手动“打补丁”以及代码已用于商业协定(在买断我授权及技术支持的使用者的作品发布一个月之后我才能进行开源及教学)。最后,库的主体部分以前和PyTom讨论过相关兼容性,PyTom也计划未来引入这个功能。(请以实际发布版为准)
【仅存于设想的一种方案】在参与renpy的测试过程中我们也提出过用粒子+生成节拍点的方式进行可视化(考虑到性能上可能存在问题就没有深入)。但是此设想可以衍生出歌词功能的实现,我们正在尝试中(基本思想:给歌曲插入关键时间节点然后通过捕获renpy中的进度条来匹配歌词的时间轴)
回复 支持 抱歉

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:13 , Processed in 0.120602 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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