Как я могу определить, щелкнул ли пользователь дважды в pygame? - PullRequest
6 голосов
/ 29 марта 2012

Я знаю, что могу проверить, был ли левый щелчок

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

, но как я могу проверить, щелкнули ли они дважды?Также есть ли способ проверить, перемещал ли пользователь колесо прокрутки вперед или назад?

Ответы [ 5 ]

10 голосов
/ 09 марта 2017

Я бы просто использовал значение дельта-времени, которое возвращает 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()
2 голосов
/ 29 марта 2012

Я никогда не использовал pygame - но:

  • Обнаружение двойных щелчков: по предположению, вместо того, чтобы обрабатывать каждый щелчок немедленно, примените задержку в 50 мс и посмотрите, получите ли вы еще одно событие щелчка за это время. Пользователь, вероятно, не заметит задержку в 50 мс.

  • Различия между колесом прокрутки вверх / вниз: см. Комментарии на этой странице документации. Видимо, определены пять кнопок - влево, влево, вправо, вверх и вверх. Колесико прокрутки вниз. То есть вы можете захватывать события с колесом прокрутки так же, как вы захватываете левые щелчки - вам нужно просто искать SCROLL_UP или аналогичный вместо LEFT.

    Просмотрите документацию, чтобы точно узнать, как называется SCROLL_UP.

2 голосов
/ 28 марта 2016

Установите таймер при первом нажатии мыши, чтобы поместить userevent в очередь событий Pygame, и установите переменную в 1, чтобы указать щелчок. Когда происходит второй щелчок, проверьте переменную и отключите объект события таймера. Проверьте, появляется ли userevent в очереди, так как это означает, что время таймера истекло. см. этот красивый ответ для получения дополнительной информации: Перемещение объекта каждые несколько секунд в 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"
1 голос
/ 29 марта 2012

Похоже, что нет собственного события двойного щелчка. Я думаю, вам нужно проверить время между последовательными событиями MOUSEBUTTONDOWN.

Колесо мыши будет генерировать события pygame.MOUSEBUTTONDOWN при броске. Кнопка будет установлена ​​на 4, когда колесо катится, и на кнопку 5, когда колесо катится

0 голосов
/ 06 июня 2019

Очень простое решение - определить pygame.time.Clock() для отслеживания времени между двумя последовательными MOUSEBUTTONDOWN событиями.

Перед тем, как основной цикл определит:

dbclock = pygame.time.Clock()

ив контроллере цикла событий:

if event.type == pygame.MOUSEBUTTONDOWN:
    if dbclock.tick() < DOUBLECLICKTIME:
        print("double click detected!")

, где DOUBLECLICKTIME - максимально допустимое время (в миллисекундах) между двумя щелчками, для которых считается двойным щелчком.Определите это до основного цикла.Например, чтобы разрешить максимальную задержку в полсекунды между двумя щелчками: DOUBLECLICKTIME = 500.

В Pygame возможно создать столько pygame.time.Clock() объектов, сколько необходимо.dbclock должен использоваться только для этой цели (я имею в виду, никаких других вызовов dbclock.tick() где-либо в главном цикле) или он будет мешать отслеживанию времени между двумя щелчками.


Для полноты позвольте мне также добавить ответ о колесе прокрутки, даже если другие ответы уже охватывали его.
Колесо прокрутки генерирует события MOUSEBUTTONDOWN и MOUSEBUTTONUP (оно считается кнопкой).Меня можно определить по параметру event.button, который равен 4, когда колесо катится, и 5, когда колесо катится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...