2012-03-29 11 views

risposta

2

non ho mai usato pygame - ma:

  • Rilevamento doppio clic: a supposizione, invece di elaborare immediatamente ciascun clic, applicare un ritardo di 50 ms e verificare se si ottiene un altro evento di clic in quel momento. L'utente probabilmente non noterà il ritardo di 50 ms.

  • Distinguere tra rotella su/giù: vedere i commenti sul this documentation page. quanto pare ci sono cinque pulsanti definiti - sinistra, centro, destra, scrollwheel-up e rotella-down. Cioè, puoi catturare gli eventi scrollwheel nello stesso modo in cui stai catturando i clic del sinistro: devi solo cercare SCROLL_UP o simili invece di LEFT.

    Cercare la documentazione per scoprire esattamente cosa viene chiamato SCROLL_UP.

1

Non sembra essere un evento nativo con doppio clic. Immagino che tu debba controllare l'ora tra eventi MOUSEBUTTONDOWN consecutivi.

La rotella del mouse genera eventi pygame.MOUSEBUTTONDOWN quando rotolati. Il pulsante sarà impostato su 4 quando la ruota viene arrotolato, e al tasto 5 quando la ruota è rotolato giù

2

Impostare un timer quando il mouse viene premuto per la prima volta di mettere un userevent sulla coda eventi pygame, e impostare una variabile a 1 per indicare un clic. Quando si verifica il secondo clic, controllare la variabile e disattivare l'evento evento del timer. Controlla se l'evento si avvicina alla coda in quanto ciò significa che il timer è scaduto. vedere questa bella risposta per ulteriori informazioni: Move an object every few seconds in Pygame

ecco il codice, sostituire la chiamata double_click() con il proprio chiamata di funzione:

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

mi basta usare il valore del tempo delta clock.tick torna ad aumentare un Timer. In questo esempio hai 0,5 secondi per fare doppio clic altrimenti il ​​timer viene resettato.

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() 
Problemi correlati