如何检测用户是否在pygame中双击?

时间:2012-03-29 03:45:15

标签: python pygame

我知道我可以检查是否有左键单击

event.type == pygame.MOUSEBUTTONDOWN and event.button == LEFT

但我如何检查他们是否双击了?还有什么方法可以检查用户是否向前或向后移动了滚轮?

5 个答案:

答案 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