2017-11-20 5 views
0

Ist es möglich, mit der Maus auf verschiedene Rechteckschaltflächen in Pygame zu klicken, die x-y-Position zu erhalten und eine if-Anweisung mit ihnen als Variablen zu machen.Speicherung von Maustastenereignissen in Pygame

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     sys.exit() 
    elif event.type == pygame.MOUSEBUTTONDOWN: 
     mouse_x, mouse_y = pygame.mouse.get_pos() 
    . 
    . 
    . 


if button_cliked_one and button_cliked_two: 
    print ('buttons clicked') 

else: 
    print('something is wrong') 
+0

ja, du kannst (wenn ich nur verstehe, was du versuchst zu sagen). Was hast du versucht? Welchen Fehler hast du bekommen? – furas

+0

BTW: Wenn Sie Ereignis 'MOUSBUTTONDOWN' haben, dann können Sie Mausposition von' event.pos' – furas

+0

bekommen Ich kann nur ein Mausereignis für eine Maustaste und nicht für mehrere machen. Wie ist das möglich? –

Antwort

1

Es ist schwer zu verstehen, was Sie wollen, aber vielleicht möchten Sie vorherige Mausklickpositionen speichern, um Rechtecke zu zeichnen?

Alles, was Sie tun müssen, ist, dann in einer anderen Variablen zu speichern. Wenn Sie nur zwei Klickpositionen gleichzeitig haben möchten, verwenden Sie diese einfach. Oder Sie können eine Python-Liste verwenden, um die Positionen einer beliebigen Anzahl von Klicks zu speichern.

import pygame, sys 

SIZE = 640, 480 
screen = pygame.display.set_mode(SIZE) 

# empty list 
all_clicks = [] 

drawn = True 
while True: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == pygame.MOUSEBUTTONDOWN: 
      # store mouse click position in the list: 
      all_clicks.append(event.pos) 
      # event.pos already has the info you'd get by calling pygame.mouse.get_pos() 
      drawn = False 
      print(all_clicks) 

    # at every second click: 
    if not len(all_clicks) % 2 and not drawn: 
     # draw a rectangle having the click positions as coordinates: 
     # pick the minimal x coordinate of both clicks as left position for rect: 
     x = min(all_clicks[-1][0], all_clicks[-2][0]) 
     # ditto for top positionn 
     y = min(all_clicks[-1][1], all_clicks[-2][1]) 
     # and calculate width and height in the same way 
     w = max(all_clicks[-1][0], all_clicks[-2][0]) - x 
     h = max(all_clicks[-1][1], all_clicks[-2][1]) - y 
     pygame.draw.rect(screen, (255, 255, 255), (x, y, w, h)) 
     drawn = True 

    # update screen: 
    pygame.display.flip() 
    # pause a while (30ms) least our game use 100% cpu for nothing: 
    pygame.time.wait(30) 
0

können Sie Variablen verwenden previous_button und current_button zwei letzten Tasten remeber. Und dann können Sie überprüfen, ob sie korrekt sind.

Es ist ähnlich wie @jsbueno Lösung, aber ich verwende zwei Variablen, nicht Liste. Wenn Sie längere Kombinationen überprüfen möchten, können Sie die Liste verwenden.

import pygame 

# --- functions --- 

def check_which_button_was_click(buttons, pos): 

    for name, (rect, color) in buttons.items(): 
     if rect.collidepoint(pos): 
      return name 

# --- main --- 

# - init - 

screen = pygame.display.set_mode((350, 150)) 

# - objects - 

buttons = { 
    'RED': (pygame.Rect(50, 50, 50, 50), (255, 0, 0)), 
    'GREEN': (pygame.Rect(150, 50, 50, 50), (0, 255, 0)), 
    'BLUE': (pygame.Rect(250, 50, 50, 50), (0, 0, 255)), 
} 

previous_button = None 
current_button = None 

# - mainloop - 

clock = pygame.time.Clock() 
running = True 

while running: 

    # - event - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 
     elif event.type == pygame.MOUSEBUTTONDOWN: 
      clicked_button = check_which_button_was_click(buttons, event.pos) 
      if clicked_button is not None: 
       previous_button = current_button 
       current_button = clicked_button 
      print(previous_button, current_button) 

    # - updates - 

    if previous_button == 'RED' and current_button == 'BLUE': 
     print('correct buttons clicked: RED & BLUE') 
     previous_button = None 
     current_button = None 

    # - draws - 

    screen.fill((0,0,0)) 

    for rect, color in buttons.values(): 
     pygame.draw.rect(screen, color, rect) 

    pygame.display.flip() 

    # - FPS - 

    clock.tick(5) 

# - end - 

pygame.quit() 
Verwandte Themen