如何在事件中检测鼠标按下或屏幕触摸?is_pressed()函数疑问
解决按住鼠标左键移动时无法触发高亮的问题
你提到的event.is_pressed()确实是用来检测单次按键/点击事件的,但它只在按键按下的瞬间事件(比如MOUSEBUTTONDOWN)中有效。当你按住左键移动鼠标时,触发的是鼠标移动事件(比如MOUSEMOTION),这时候事件对象的is_pressed()并不会返回true——因为这个事件本身不是由按键按下触发的,而是由移动触发的。
要解决这个问题,你需要换一种方式:在移动事件中主动查询当前鼠标按键的持续状态,而不是依赖事件对象的is_pressed()方法。以Pygame为例(从你的tiles和LMB描述推测你可能用这个库),可以这样修改代码:
import pygame # 假设你的初始化和tiles对象已经定义好 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 处理点击瞬间的高亮 if event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: # 1代表鼠标左键 tiles.highlight() # 处理按住左键移动时的高亮 elif event.type == pygame.MOUSEMOTION: # 获取当前所有鼠标按键的状态,返回的是一个元组,索引0对应左键 mouse_buttons = pygame.mouse.get_pressed() if mouse_buttons[0]: tiles.highlight() # 其他渲染逻辑 pygame.display.flip()
核心原因解释:
event.is_pressed()是绑定到单个事件的,比如MOUSEBUTTONDOWN事件只在按下瞬间触发,它的is_pressed()只会在这个事件周期内为true;而MOUSEMOTION事件是每帧移动时触发,事件对象本身不携带"按键持续按下"的状态。pygame.mouse.get_pressed()是实时获取当前鼠标的按键状态,不管当前触发的是什么事件,只要左键处于按住状态,就能检测到。
如果你用的是其他GUI/游戏库(比如Pyglet、Tkinter),思路也是类似的:找到对应库中实时查询按键状态的API,在移动事件回调中检查左键是否持续按下,再触发tiles.highlight()。
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

