我知道我可以检查是否有左键单击
event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT
但我如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮?
答案 0 :(得分:9)
我只使用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()
答案 1 :(得分:2)
我从未使用pygame
- 但是:
检测到双击,而不是立即处理每次点击,应用50毫秒的延迟,看看您是否在那段时间内再次点击了一次。用户可能不会注意到50ms的延迟。
区分滚轮向上/向下:查看this documentation page.上的注释显然有五个按钮定义 - 左,中,右,滚轮向上和向下滚轮。也就是说,您可以像捕获左键单击一样捕获滚轮事件 - 您只需要查找SCROLL_UP
或类似内容而不是LEFT
。
查找文档以确切了解SCROLL_UP
被调用的内容。
答案 2 :(得分:2)
第一次按下鼠标时设置计时器,在pygame事件队列上放置一个userevent,并将变量设置为1表示单击。发生第二次单击时,检查变量并将timer事件对象设置为off。检查队列中是否存在userevent,因为这意味着计时器已超时。有关详细信息,请参阅此精美答案:Move an object every few seconds in Pygame
以下是代码,用您自己的函数调用替换double_click()
调用:
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"
答案 3 :(得分:1)
似乎没有原生双击事件。我猜你需要检查连续的MOUSEBUTTONDOWN事件之间的时间。
滚动时,鼠标滚轮将生成pygame.MOUSEBUTTONDOWN事件。当车轮卷起时按钮将设置为4,当车轮滚下时按钮将设置为按钮5
答案 4 :(得分:0)
一个非常简单的解决方案是定义一个V
来跟踪两个连续pygame.time.Clock()
事件之间的时间。
在主循环定义之前:
MOUSEBUTTONDOWN
和事件循环控制器中:
dbclock = pygame.time.Clock()
其中if event.type == pygame.MOUSEBUTTONDOWN:
if dbclock.tick() < DOUBLECLICKTIME:
print("double click detected!")
是两次单击之间允许的最长时间(以毫秒为单位),这被认为是双击。在mainloop之前定义它。例如,要允许两次单击之间的最大延迟为半秒:DOUBLECLICKTIME
。
在pygame中可以创建所需的DOUBLECLICKTIME = 500
个对象。 pygame.time.Clock()
必须仅用于此目的(我的意思是,在主循环中的任何地方都不能对dbclock
进行任何其他调用),否则它将使两次单击之间的时间跟踪变得混乱。
为了完整起见,让我也添加有关滚轮的答案,即使其他答案已经涵盖了它。
滚轮发出dbclock.tick()
和MOUSEBUTTONDOWN
事件(被视为按钮)。我可以通过MOUSEBUTTONUP
参数来识别,该参数在滚轮向上滚动时为event.button
,在滚轮向下滚动时为4
。