2012-03-29 13 views

Respuesta

2

nunca he utilizado pygame - pero:

  • La detección de dobles clics: supongo que, en lugar de procesar cada clic de inmediato, aplique un retraso de 50 ms y vea si obtiene otro evento de clic en ese momento. El usuario probablemente no notará el retraso de 50 ms.

  • Distinguir entre la rueda del ratón arriba/abajo: ver los comentarios sobre this documentation page. Al parecer, hay cinco botones definidos - izquierda, centro, derecha, arriba y rueda de desplazamiento scroll hacia abajo. Es decir, puede capturar los eventos de la rueda de desplazamiento de la misma forma que captura los clics izquierdos; solo tiene que buscar SCROLL_UP o similar en lugar de LEFT.

    Busque la documentación para saber exactamente cómo se llama SCROLL_UP.

1

No parece haber un evento nativo de doble clic. Supongo que necesitarás verificar el tiempo entre eventos consecutivos de MOUSEBUTTONDOWN.

La rueda del mouse generará eventos pygame.MOUSEBUTTONDOWN cuando se lance. El botón se establece en 4 cuando la rueda se enrolla, y el botón 5 cuando la rueda se bajó

2

Establecer un temporizador cuando se pulsa el ratón por primera vez para colocar una UserEvent en la cola de eventos de pygame, y establecer una variable a 1 para indicar un clic. Cuando se produce el segundo clic, compruebe la variable y establezca el objeto de evento del temporizador en apagado. Verifique si el evento de uso aparece en la cola, ya que esto significa que el tiempo de espera del temporizador ha expirado. ver esta hermosa respuesta para más información: Move an object every few seconds in Pygame

Aquí está el código, reemplace la llamada double_click() con su propia llamada a la función:

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

Me acabo de utilizar el valor de tiempo delta que clock.tick vuelve a aumentar una minutero. En este ejemplo, tiene 0,5 segundos para hacer doble clic, de lo contrario, el temporizador se restablece.

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() 
Cuestiones relacionadas