2013-11-24 3 views
0

Я пытаюсь заставить этот код зацикливаться при нажатии правой кнопки мыши, насколько я могу видеть, что код не имеет ничего плохого, но окно pygame зависает, когда я нажимаю кнопку правая кнопка. Вот мой код, который я пытаюсь запустить:Замораживание окна Pygame при запуске кода

elif event.type == MOUSEBUTTONDOWN and event.button == 3: 
    pressing = 1 
    while pressing: 
     x, y = pygame.mouse.get_pos() 
     x1, y1 = x - space_ship_rect.x, y - space_ship_rect.y 
     angle = math.atan2(y1, x1) 
     movex = speed*math.cos(angle) 
     movey = speed*math.sin(angle) 
     space_ship_rect.centerx += movex 
     space_ship_rect.centery += movey 
     print("Right Button Pressed") 
    if event.type == MOUSEBUTTONUP: 
     pressing = 0 
+0

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

+1

@ möter: вставляемый код использовал вкладки; Я заменил их пробелами. –

+0

Кажется, что ваш 'while press:' loop блокирует поток событий. – Sinkingpoint

ответ

0

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

Как обычно работают обработчики событий, их функция выполняется раз за новое событие. Во время этого дескриптора они не реагируют на новые события. Поскольку MOUSEBUTTONUP станет новым событием, вам придется обрабатывать его отдельно.

Обработчик событий не может сделать так, как вы в настоящее время настроили свой код, так как он застрял в обработке MOUSEBUTTONDOWN, замерзая окно.

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

В противном случае вы можете запустить новый поток, который будет зацикливать ваш код, в то время как некоторая переменная истинна. Затем вы можете установить эту переменную в false в вашем обработчике MOUSEBUTTONUP.

Определить это вне обработчика событий:

import thread 

mouse_pressing = True 

def mouse_pressing_func(): 
    while mouse_pressing: 
     # Do fancy stuff 

Затем использовать это в обработчике событий:

elif event.type == MOUSEBUTTONDOWN and event.button == 3: 
    mouse_pressing = True 
    thread.start_new_thread(mouse_pressing_func,()) 
elif event.type == MOUSEBUTTONUP and event.button == 3: 
    mouse_pressing = False 

Edit:

Теперь, когда отступы Решенные, я вижу что у вас есть еще одна проблема: вы даже не проверяете, является ли событие MOUSEBUTTONUP в вашем цикле, но потом. Это означает, что вы никогда не достигнете этого утверждения.

+0

Я не совсем понимаю, что вы пытаетесь мне сказать, где вы говорите, что я должен поставить цикл? – user2993584

+0

@ user2993584: jazzpi говорит, что у вас не должно быть петли вообще. –

+0

@ user2993584: «Выполняйте свой код один раз за событие, оставив цикл». – jazzpi

0

Может быть, это просто ошибка в вставленном коде, а для меня это выглядит как if -statement в конце кода istn't в вашем while -loop, так что вы получите бесконечный цикл, который вызывает окно заморозить. Greets, TheWormKill

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