2013-06-29 2 views
1

Я пытаюсь сделать доску, которая меняет цвет при щелчке левой кнопкой мыши. Но когда я нажимаю, он циклически проходит через is_square_clicked() 3 раза. Это проблема, я только хочу, чтобы она сделала это один раз. Как вы можете догадаться, это вызывает проблему для моей программы. Итак, как я могу ограничить его 1 проход через клик? Благодаря!несколько кликов, зарегистрированных в pygame

def is_square_clicked(mousepos): 
    x, y = mousepos 
    for i in xrange(ROWS): 
     for j in xrange(COLS): 
      for k in xrange(3): 
       if x >= grid[i][j][1] and x <= grid[i][j][1] + BLOCK: 
        if y >= grid[i][j][2] and y <= grid[i][j][2] + BLOCK: 
         if grid[i][j][0] == 0: 
          grid[i][j][0] = 1 
         elif grid[i][j][0] == 1: 
          grid[i][j][0] = 0 

while __name__ == '__main__': 
    tickFPS = Clock.tick(fps) 
    pygame.display.set_caption("Press Esc to quit. FPS: %.2f" % (Clock.get_fps())) 
    draw_grid() 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       pygame.quit() 
       sys.exit() 
     elif event.type == pygame.MOUSEBUTTONUP and event.button == 1: 
      mousepos = pygame.mouse.get_pos() 
      is_square_clicked(mousepos) 
    pygame.display.update() 

ответ

1

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

+0

У меня он активируется только на mousebuttonUP, поэтому держать мышью не будет проблемой, но каков подходящий способ заставить ее ждать по щелчку? Имеет ли смысл приостанавливать всю программу во время ожидания нажатием кнопки? Законные вопросы, а не сарказм. – BradleyMoore

+0

@thefritobandit зависит от программы. Что вы хотите сделать? если это единственная часть программы, да, это имеет смысл. Кроме того, это может быть отдельно от основного цикла программы, поэтому только это остановит. – Pip

0

им будет догадаться, что, так как игра петли больше, чем один раз щелкните его изменения более чем один раз

даже если щелчок очень быстро цикл зациклился быстрее (в зависимости от FPS)

здесь пример, который изменит цвет экрана на каждый клике:

"""Very basic. Change the screen color with a mouse click.""" 
import os,sys #used for sys.exit and os.environ 
import pygame #import the pygame module 
from random import randint 

class Control: 
    def __init__(self): 
     self.color = 0 
    def update(self,Surf): 
     self.event_loop() #Run the event loop every frame 
     Surf.fill(self.color) #Make updates to screen every frame 
    def event_loop(self): 
     for event in pygame.event.get(): #Check the events on the event queue 
      if event.type == pygame.MOUSEBUTTONDOWN: 
       #If the user clicks the screen, change the color. 
       self.color = [randint(0,255) for i in range(3)] 
      elif event.type == pygame.QUIT: 
       pygame.quit();sys.exit() 

if __name__ == "__main__": 
    os.environ['SDL_VIDEO_CENTERED'] = '1' #Center the screen. 
    pygame.init() #Initialize Pygame 
    Screen = pygame.display.set_mode((500,500)) #Set the mode of the screen 
    MyClock = pygame.time.Clock() #Create a clock to restrict framerate 
    RunIt = Control() 
    while 1: 
     RunIt.update(Screen) 
     pygame.display.update() #Update the screen 
     MyClock.tick(60) #Restrict framerate 

этого код будет блитирования случайного цвета фона каждый раз, когда вы щелкаете, так что вы, вероятно, можете выяснить правильный способ сделать это из кода выше

Удачи!