马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 ZYKsslm 于 2024-8-15 23:29 编辑
PressedButton 挤压按钮
最近在论坛看见有人在问如何获取长按事件,索性自己花了点时间写了一个新的用户接口(确信)。
使用要求:
- 将源码复制到项目的 game 目录中并保存为 rpy 脚本文件。
- 或是直接将本帖附件保存到项目的 game 目录中。
提示:
源码:
[RenPy] 纯文本查看 复制代码 python early:
import pygame
class PressedButton(renpy.display.behavior.Button):
def __init__(self, *args, **kwargs):
self.press_action = kwargs.pop("press_action", NullAction())
self.release_action = kwargs.pop("release_action", NullAction())
self.press_time = float(kwargs.pop("press_time", 0))
self.stable_updater = kwargs.pop("stable_updater", [0])
super().__init__(*args, **kwargs)
self.updater = 0
self.size = (0, 0)
self.clock = 0
def render(self, width, height, st, at):
self.size = renpy.render(self.child, width, height, st, at).get_size()
return super().render(width, height, st, at)
def event(self, ev, x, y, st):
if not ((0 <= x <= self.size[0]) and (0 <= y <= self.size[1])):
return
if ev.type == pygame.MOUSEBUTTONDOWN and ev.button == 1:
self.clock = st
self.updater = 0
renpy.timeout(0)
elif ev.type == pygame.MOUSEBUTTONUP and ev.button == 1:
if self.clock:
self.clock = 0
self.updater = 0
else:
renpy.run(self.release_action)
return
if self.clock:
if (elapsed_time := st - self.clock) >= self.press_time:
self.clock = 0
self.updater = self.press_time
renpy.run(self.press_action)
else:
self.updater = elapsed_time
renpy.restart_interaction()
renpy.timeout(0)
return super().event(ev, x, y, st)
def visit(self):
return [self.child]
renpy.register_sl_displayable("PressedButton", PressedButton, "pressed_button", 1
).add_property("press_action"
).add_property("release_action"
).add_property("press_time"
).add_property_group("button")
style pressed_button:
is fixed
使用:
因为 PressedButton 继承自 renpy.display.behavior.Button ,所以使用方式与 Button 基本一致,且拥有其所有的特性。
但不同的是:
- 需要改用 PressedButton 关键字。
- 需要添加 press_action 、release_action(可选) 、press_time 三个新特性。
- 应始终保持按钮内只有一个可视组件,若有多个请放入一个容器内。
错误示范:
[RenPy] 纯文本查看 复制代码
screen test:
PressedButton:
align (0.5, 0.5)
press_action Notify("计时结束")
release_action Notify("鼠标释放")
press_time 5
text "Hello" align (0.5, 0.5)
text "World" align (0.5, 0.6)
label start:
call screen test
return
正确示范:
[RenPy] 纯文本查看 复制代码
screen test:
PressedButton:
align (0.5, 0.5)
press_action Notify("计时结束")
release_action Notify("鼠标释放")
press_time 5
vbox:
spacing 10
text "Hello"
text "World"
label start:
call screen test
return
其他功能:
因为考虑到许多开发者有需要将长按与条联动的需求,所以 PressedButton 封装了一个简单的与条联动的功能,能够高效地满足不同的交互方式与部分小游戏的需求。
使用方式很简单,只需要将条值与 PressedButton 对象的 updater 属性绑定,就可以动态地在玩家长按按钮时更新条值。
[RenPy] 纯文本查看 复制代码
screen test:
vbox:
align (0.5, 0.5)
spacing 20
PressedButton:
xalign 0.5
as pressed_button
press_action Notify("计时结束")
release_action Notify("鼠标释放")
press_time 10
imagebutton:
idle "#00ccff"
hover "#0099ff"
xalign 0.5
xysize (100, 100)
action NullAction()
bar:
xysize (500, 20)
value FieldValue(pressed_button, "updater", pressed_button.press_time)
label start:
call screen test
return
|