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


第一次按下鼠标时设置计时器,将userevent放置在pygame事件队列上,并将变量设置为1以指示单击。当发生第二次单击时,检查变量并将计时器事件对象设置为off。检查队列上是否出现userevent,因为这意味着计时器已超时。有关更多信息,请参见这个漂亮的答案:

下面是代码,用您自己的函数调用替换
双击()
调用:

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毫秒,双击有点容易被检测到。然而,这使得我的程序看起来很难看,每次用户单击按钮时响应都很慢。