mouse.get_pressed () inconsistente / regresando (0, 0, 0)

Sep 20 2020

editar (resuelto): usar event.button parece haber hecho el truco. Cuando devuelve 0, 0, 0, devuelve el botón correcto del mouse (1 = izquierda, 3 = derecha)

Intenté buscar soluciones a esto, pero en cada respuesta parece que la persona no sabía o se olvidó de incluir el evento en pg.event.get () .. la detección del mouse en pygame ha dejado de funcionar de manera confiable y yo ' No estoy seguro de si es un error de hardware, mi código es incorrecto o algo más. Aquí hay una versión simplificada de mi bucle de juego para el mouse:

while running:
     for event in pg.event.get():
            pos = pg.mouse.get_pos()
            if event.type == pg.MOUSEBUTTONDOWN:
                if grid_space.get_rect(x=(adj_x), y=(adj_y)).collidepoint(pos):
                    if pg.mouse.get_pressed()[2]:
                        do_thing()
                    elif event.button == 4:
                        do_thing()
                    elif event.button == 5:
                        do_thing()
                    else:
                        print(pg.mouse.get_pressed())
                        do_thing()

Moví el botón principal del mouse hacia el else porque es la única forma de hacer que la acción más importante sea más confiable en este momento, pero al imprimir el resultado else también encontré que uno de cada 4 o 5 clics devuelve (0, 0, 0) en lugar de (1, 0, 0). Probé diferentes formas de escribir la expresión, simplificando la estructura, aumentando el reloj de Pygame y nada funciona.

¿Alguien se ha encontrado con esto y hay una solución?

editar: Ejecuté otra prueba guardando el resultado de get_pressed en una variable inmediatamente y todavía devuelve 0, 0, 0, así que estoy bastante seguro de que su estado no ha cambiado de MOUESBUTTONDOWN al momento en que se llama.

Respuestas

1 Rabbid76 Sep 19 2020 at 23:41

pygame.mouse.get_pressed()obtener el estado actual de los botones del mouse. El estado de los botones puede haber cambiado desde que ocurrió el evento del mouse. Tenga en cuenta que los eventos se almacenan en una cola y recibirá los eventos almacenados más adelante en la aplicación por pygame.event.get(). Mientras tanto, el estado del botón puede haber cambiado debido a esto, el botón que hace que el MOUSEBUTTONDOWNevento se almacene en el buttonatributo del pygame.event.Eventobjeto inmediatamente. En el bucle de eventos, cuando obtiene el evento, el estado de event.buttony pygame.mouse.get_pressed()puede ser diferente.
Lo mismo ocurre con pygame.mouse.get_pos(). La posición del mouse se almacena en el atributo posUse event.buttony en event.poslugar de pygame.mouse.get_pressed()y pygame.mouse.get_pos():

while running:
     for event in pg.event.get():
            
            if event.type == pg.MOUSEBUTTONDOWN:
               print(event.button)

               if grid_space.get_rect(topleft=(adj_x, adj_y)).collidepoint(event.pos):
                    if event.button == 2:
                        do_thing()
                    elif event.button == 4:
                        do_thing()
                    elif event.button == 5:
                        do_thing()
                    else:
                        do_thing()

pygame.mouse.get_pos()y pygame.mouse.get_pressed()no están destinados a ser utilizados en el bucle de eventos. Las funciones deben usarse directamente en el ciclo de la aplicación.