2015-07-19 3 views
0

Я хочу, чтобы код был привязан к щелчку мыши (pygame.MOUSEBUTTONUP), чтобы выполнить только ПОСЛЕ кода, связанного с нажатием клавиши пробела (pygame.KEYDOWN и pygame.K_SPACE), на 100% завершено. Любые щелчки мыши до этого следует игнорировать.Щелчок мышью только после завершения последовательности нажатия клавиш (pygame)

Я знаю, что второе заявление if не будет работать из-за его отношения или его отсутствия до for event in pygame.event.get():. Я просто не знаю, как писать, что правильно ...

import pygame 

screen = pygame.display.set_mode((600, 400)) 

def task(): 

taskExit = False 

while not taskExit: 

    for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

      elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: 
       print "Drawing..." 
       screen.fill(gray) 
        #<<<code to create pretty pictures>>> 

       if event.type == pygame.MOUSEBUTTONUP: 
        print "mouse at (%d, %d)" % event.pos # where they clicked. 
         #<<<more code to interact with said pretty pictures>>> 

task() 
pygame.quit() 
quit() 
+0

Может быть установлен флаг, если первое условие '' 'True''' затем добавить флаг к MouseUp условной и переместить его в течение набора петель (ип-отступа его) , – wwii

+0

@wwii Любые другие идеи? ахх. К сожалению, я уже это пробовал. Проблема в том, что человек нажимает клавишу пробела и больше игнорирует мышь, пока код, связанный с нажатием клавиши пробела, не будет завершен на 100%. – lnNoam

+0

@wwii Вы можете себе представить задачу: «нажмите синий или зеленый круг - в зависимости от того, какой вы любимый цвет». Пробел запускает эти круги для рисования. Если человек нажимает до того, как круги нарисованы, это просто нерелевантный ответ (например, их палец скользнул в ожидании). – lnNoam

ответ

2

С небольшим реорганизации это будет работать, как вы ожидаете. Экспорт код, который вы хотите выполнить после этих событий на две функции:

def space_bar(): 
      print "Drawing..." 
      screen.fill(gray) 
       #<<<code to create pretty pictures>>> 

    def mouse_event(): 
      print "mouse at (%d, %d)" % event.pos # where they clicked. 
       #<<<more code to interact with said pretty pictures>>> 

, который позволяет называть их как после того, как события мыши и позволяют управлять о последовательности выполнения кода.

elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: 
     space_bar() 

    elif event.type == pygame.MOUSEBUTTONUP: 
     space_bar() 
     mouse_event() 
+0

Спасибо за ответ. К сожалению, это не совсем то, что я хотел сделать в этой ситуации. В целом, однако, ваш подход - это тот, который я должен придерживаться в будущем, поскольку он намного более аккуратен. Еще раз спасибо. – lnNoam

1

Так, для потомков, есть очень простой способ сделать это в Pygame (ой, значение в деле чтения документации ...)

А именно, с pygame.event.set_blocked(pygame.MOUSEBUTTONUP) и pygame.event.set_allowed(pygame.MOUSEBUTTONUP) дает возможность просто заблокируйте щелчок левой кнопкой мыши по желанию. Очень удобно.

например,

import pygame 

screen = pygame.display.set_mode((600, 400)) 

def task(): 

    space_bar_pressed = 0 

    taskExit = False 

    while not taskExit: 

     for event in pygame.event.get(): 

       if event.type == pygame.QUIT: 
        pygame.quit() 
        quit() 

       elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: 
        pygame.event.set_blocked(pygame.MOUSEBUTTONUP) #blocking 
        print "Drawing..." 
        screen.fill(gray) 
        #<<<code to create pretty pictures>>> 
        pygame.display.update() 
        pygame.event.set_allowed(pygame.MOUSEBUTTONUP) #allowing 
        space_bar_pressed = 1 

       elif event.type == pygame.MOUSEBUTTONUP and space_bar_pressed == 1: 
        print "mouse at (%d, %d)" % event.pos # where they clicked. 
        #<<<more code to interact with said pretty pictures>>> 
        pygame.display.update() 

task() 
pygame.quit() 
quit() 
+0

Как программа узнает, что задача рисования завершена, и кнопки мыши могут быть включены? – wwii

+0

Вы правы; он не «знает», что задача завершена. Однако то, что мое решение делает, инструктирует первый «elif» (событие пробела) блокировать второй «elif» (событие мыши) от начала, пока первый «elif» не выполнит свою работу. – lnNoam

+0

Кажется типичным, что обновление экрана происходит после обработки * цикла событий * в основном цикле игры.Таким образом, цифры не будут отображаться на экране до тех пор, пока следующий кадр не покатится. '' 'pygame.event.set_allowed''' нужно будет позиционировать после (во времени/последовательности) следующий' '' pygame.display.update''' (или '' 'flip'''). – wwii

Смежные вопросы