2012-03-29 32 views

Trả lời

2

Tôi chưa bao giờ sử dụng pygame - nhưng:

  • Phát hiện nhấp chuột kép: khi đoán, thay vì xử lý từng nhấp chuột ngay lập tức, hãy áp dụng độ trễ 50ms và xem liệu bạn có nhận được một sự kiện nhấp chuột khác trong thời gian đó hay không. Người dùng có thể sẽ không nhận thấy độ trễ 50ms.

  • Phân biệt giữa scrollwheel lên/xuống: xem các ý kiến ​​trên this documentation page. Rõ ràng có năm nút định nghĩa - trái, giữa, phải, con lăn-up và scrollwheel xuống. Tức là, bạn có thể nắm bắt các sự kiện bánh cuộn giống như cách bạn đang nắm bắt các nhấp chuột trái - bạn chỉ cần tìm kiếm SCROLL_UP hoặc tương tự thay vì LEFT.

    Tra cứu tài liệu để tìm hiểu chính xác những gì SCROLL_UP được gọi.

1

Dường như không phải là sự kiện nhấp đúp gốc. Tôi đoán bạn cần kiểm tra thời gian giữa các sự kiện MOUSEBUTTONDOWN liên tiếp.

Bánh xe chuột sẽ tạo ra sự kiện pygame.MOUSEBUTTONDOWN khi được cuộn. Nút sẽ được thiết lập đến 4 khi bánh được cuộn lại, và nút 5 khi bánh xe đang lăn xuống

2

Đặt hẹn giờ khi chuột được bấm lần đầu tiên để đặt người dùng vào hàng đợi sự kiện pygame và đặt biến thành 1 để cho biết nhấp chuột. Khi nhấp chuột thứ hai xảy ra, hãy kiểm tra biến và đặt đối tượng sự kiện hẹn giờ thành tắt. Kiểm tra xem userevent có xuất hiện trên hàng đợi hay không vì điều này có nghĩa là bộ hẹn giờ đã hết thời gian chờ. xem câu trả lời xinh đẹp này cho biết thêm thông tin: Move an object every few seconds in Pygame

Đây là mã, thay thế các double_click() cuộc gọi với lời gọi hàm của riêng bạ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

tôi chỉ cần sử dụng các giá trị thời gian đồng bằng mà clock.tick lợi nhuận tăng một hẹn giờ. Trong ví dụ này, bạn có 0,5 giây để nhấp đúp nếu không bộ hẹn giờ được đặt lại.

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() 
Các vấn đề liên quan