pygame.mouse.get_rel()仅返回(0,0),如何获取正确的鼠标相对位移值
问题原因及修复方案
核心问题原因
pygame.mouse.get_rel()的特性是每次调用后会自动清空累计的相对位移值,你的代码在检测到鼠标按下后先无意义调用了一次get_rel()没有保存数值,后续在移动事件中再次调用时,只能拿到两次调用之间极短时间的位移,绝大多数情况就是(0,0)。- 事件处理逻辑结构错误:你在
MOUSEBUTTONDOWN事件处理分支内嵌套了第二层事件循环,还加入了多处time.sleep()阻塞逻辑,不仅会导致pygame无法正常累计鼠标移动的位移数据,还会丢失事件队列中的MOUSEMOTION事件,进一步导致get_rel()返回值异常。 - 代码存在基础变量错误:外层事件循环的迭代变量是
event,但判断条件写的是ev.type,属于变量名拼写错误,会直接触发运行时报错。
正确实现方案
不要嵌套事件循环,新增一个状态变量标记滑块是否处于拖动状态,在主循环中统一处理所有事件即可,参考代码如下:
import pygame import time # 提前定义拖动状态标记 drag_red = False # 滑块初始位置你可以保留自己的原值 red_x = 515 # 建议用Clock控制帧率,替代sleep更稳定 clock = pygame.time.Clock() while True: # 控制帧率为60,可根据需要调整 clock.tick(60) for event in pygame.event.get(): # 处理窗口关闭事件,你可按需保留原有退出逻辑 if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() if Knob_red.collidepoint(pos): drag_red = True # 按下时调用一次get_rel清空之前的旧位移数据,避免影响本次拖动 pygame.mouse.get_rel() elif event.type == pygame.MOUSEBUTTONUP: # 鼠标任意按键松开都结束拖动 drag_red = False elif event.type == pygame.MOUSEMOTION: if drag_red: # 只有处于拖动状态时才获取相对位移更新滑块位置 rel_x = pygame.mouse.get_rel()[0] red_x += rel_x # 限制滑块的移动范围 red_x = max(515, min(783, red_x)) # 后续的画面绘制、滑块渲染逻辑放在这里
额外注意点
如果需要同时实现多个颜色滑块的拖动功能,只需要为每个滑块单独设置对应的拖动状态标记,复用上述逻辑即可。
内容的提问来源于stack exchange,提问作者Jonathan Lenhart
相关产品推荐
相关产品推荐

