Python 如何检测用户是否在pygame中双击?
我知道我可以检查是否有左键点击Python 如何检测用户是否在pygame中双击?,python,pygame,Python,Pygame,我知道我可以检查是否有左键点击 event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT 但我如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮?似乎没有本地双击事件。我猜你需要检查连续鼠标按下事件之间的时间 鼠标滚轮在滚动时将生成pygame.MOUSEBUTTONDOWN事件。当滚轮向上滚动时,按钮将设置为4,当滚轮向下滚动时,按钮将设置为5。我从未使用过pygame,但是: 检测双击:猜测一下,不是
event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT
但我如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮?似乎没有本地双击事件。我猜你需要检查连续鼠标按下事件之间的时间
鼠标滚轮在滚动时将生成pygame.MOUSEBUTTONDOWN事件。当滚轮向上滚动时,按钮将设置为4,当滚轮向下滚动时,按钮将设置为5。我从未使用过pygame,但是:
- 检测双击:猜测一下,不是立即处理每次点击,而是应用50毫秒的延迟,看看在这段时间内是否会发生另一次点击事件。用户可能不会注意到50毫秒的延迟
- 区分上/下滚轮:请参阅上的注释。显然,定义了五个按钮-左、中、右、上滚轮和下滚轮。也就是说,您可以像捕获左键单击一样捕获滚轮事件-您只需查找
或类似内容,而不是SCROLL\u UP
请查阅文档,以准确了解所调用的left
SCROLL\u up
双击()
调用:
def run():
global clock, double_click_event, timer
double_click_event = pygame.USEREVENT + 1
timer = 0
while True:
clock.tick(60)
check_events()
frame.update()
screen.blit(frame, (0,0))
pygame.display.flip()
def check_events():
global dispatcher, double_click_event, timer
events = pygame.event.get()
for event in events:
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if timer == 0:
pygame.time.set_timer(double_click_event, 500)
timerset = True
else:
if timer == 1:
pygame.time.set_timer(double_click_event, 0)
double_click()
timerset =False
if timerset:
timer = 1
return
else:
timer = 0
return
elif event.type == double_click_event:
# timer timed out
pygame.time.set_timer(double_click_event, 0)
timer = 0
print "evt = dble click"
我只需要使用
clock.tick
返回的增量时间值来增加计时器。在本例中,您有0.5秒的时间双击,否则计时器将重置
import sys
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
BLACK = pg.Color('black')
FONT = pg.font.Font(None, 32)
def game():
clock = pg.time.Clock()
timer = 0
dt = 0
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
if event.type == pg.MOUSEBUTTONDOWN:
if event.button == 1:
if timer == 0: # First mouse click.
timer = 0.001 # Start the timer.
# Click again before 0.5 seconds to double click.
elif timer < 0.5:
print('double click')
timer = 0
# Increase timer after mouse was pressed the first time.
if timer != 0:
timer += dt
# Reset after 0.5 seconds.
if timer >= 0.5:
print('too late')
timer = 0
screen.fill(BLACK)
txt = FONT.render(str(round(timer, 2)), True, (180, 190, 40))
screen.blit(txt, (40, 40))
pg.display.flip()
# dt == time in seconds since last tick.
# / 1000 to convert milliseconds to seconds.
dt = clock.tick(30) / 1000
if __name__ == '__main__':
game()
pg.quit()
sys.exit()
导入系统
导入pygame作为pg
第init页()
屏幕=pg.display.set_模式((640480))
黑色=pg.Color(“黑色”)
FONT=pg.FONT.FONT(无,32)
def game():
时钟=pg.time.clock()
计时器=0
dt=0
运行=真
运行时:
对于pg.event.get()中的事件:
如果event.type==pg.QUIT:
运行=错误
如果event.type==pg.MOUSEBUTTONDOWN:
如果event.button==1:
如果计时器=0:#第一次单击鼠标。
定时器=0.001#启动定时器。
#在0.5秒之前再次单击以双击。
elif定时器<0.5:
打印('双击')
计时器=0
#第一次按下鼠标后增加计时器。
如果计时器0:
定时器+=dt
#0.5秒后复位。
如果计时器>=0.5:
打印(‘太晚了’)
计时器=0
屏幕填充(黑色)
txt=FONT.render(str(四舍五入(计时器,2)),True,(180,190,40))
blit(txt,(40,40))
pg.display.flip()
#dt==自上次滴答声以来的时间(以秒为单位)。
#/1000将毫秒转换为秒。
dt=时钟滴答声(30)/1000
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
游戏()
第页退出
sys.exit()
一个非常简单的解决方案是定义一个
pygame.time.Clock()
来跟踪两个连续的MOUSEBUTTONDOWN
事件之间的时间
在主循环定义之前:
dbclock = pygame.time.Clock()
在事件循环控制器中:
if event.type == pygame.MOUSEBUTTONDOWN:
if dbclock.tick() < DOUBLECLICKTIME:
print("double click detected!")
如果event.type==pygame.MOUSEBUTTONDOWN:
如果dbclock.tick()<双击时间:
打印(“双击检测到!”)
其中,DOUBLECLICKTIME
是被视为双击的两次单击之间允许的最长时间(以毫秒为单位)。在主循环之前定义它。例如,要允许两次单击之间的最大延迟为半秒:DOUBLECLICKTIME=500
在pygame中,可以创建尽可能多的pygame.time.Clock()
对象dbclock
必须仅用于此目的(我的意思是,在主循环中的任何地方都不能调用dbclock.tick()
),否则它会干扰两次单击之间的时间跟踪
为了完整起见,我还要添加有关滚轮的答案,即使其他答案已经涵盖了它。
滚轮会发出
MOUSEBUTTONDOWN
和MOUSEBUTTONUP
事件(它被视为一个按钮)。我可以通过事件按钮
参数来识别,当轮子向上滚动时,它是4
,当轮子向下滚动时,它是5
。我不认为双击足够快,可以在不到50毫秒的时间内完成。即使我将pygame设置为等待142毫秒,它仍然无法捕获双击。如果我等待166毫秒,双击有点容易被检测到。然而,这使得我的程序看起来很难看,每次用户单击按钮时响应都很慢。