2012-03-29 20 views
5

wiem, że mogę sprawdzić, czy nie było po lewej kliknijJak wykryć, czy użytkownik dwukrotnie kliknął w pygame?

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

ale w jaki sposób mogę sprawdzić, czy podwójnym kliknięciu? Czy istnieje również sposób sprawdzenia, czy użytkownik przesunął kółko przewijania w przód lub w tył?

Odpowiedz

2

nigdy nie używałem pygame - ale:

  • Wykrywanie podwójnych kliknięć: Zgadnij, zamiast przetwarzać każde kliknięcie natychmiast, zastosuj opóźnienie 50 ms i sprawdź, czy otrzymasz kolejne zdarzenie kliknięcia w tym czasie. Użytkownik prawdopodobnie nie zauważy opóźnienia 50ms.

  • Rozróżnianie scrollwheel w górę/w dół: zobaczyć komentarze na this documentation page. Najwyraźniej istnieje pięć przycisków zdefiniowane - lewy, środkowy, prawy, scrollwheel-up i scrollwheel-dół. Oznacza to, że można przechwytywać zdarzenia kółka przewijania w ten sam sposób, w jaki przechwytuje się kliknięcia lewym przyciskiem myszy - wystarczy poszukać SCROLL_UP lub podobnego zamiast LEFT.

    Sprawdź dokumentację, aby dowiedzieć się, co dokładnie nazywa się SCROLL_UP.

1

Wygląda na to, że nie ma natywnego zdarzenia dwukrotnego kliknięcia. Zgaduję, że musisz sprawdzić czas pomiędzy kolejnymi zdarzeniami MOUSEBUTTONDOWN.

Koło myszy wygeneruje zdarzenia pygame.MOUSEBUTTONDOWN po zakończeniu. Przycisk zostanie ustawiony na 4, gdy koło jest zwinięte, a przycisk 5, aby gdy koło jest spływały

2

Ustaw timer, gdy po raz pierwszy do umieszczenia UserEvent na kolejki zdarzeń pygame i ustawić zmienną na 1, aby wskazać kliknięcie myszą przycisku. Gdy pojawi się drugie kliknięcie, sprawdź zmienną i wyłącz obiekt zdarzenia licznika czasu. Sprawdź, czy w kolejce pojawi się komunikat userevent, ponieważ oznacza to, że upłynął limit czasu. zobaczyć ten piękny odpowiedź uzyskać więcej informacji: Move an object every few seconds in Pygame

Oto kod, wymień połączenia double_click() z własnego wywołania funkcji:

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" 
7

bym po prostu użyć wartości czasu delta że clock.tick powraca do zwiększenia regulator czasowy. W tym przykładzie masz 0,5 sekundy na podwójne kliknięcie, w przeciwnym razie timer zostanie zresetowany.

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() 
Powiązane problemy