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

Sep 20 2020

editar (resolvido): usar event.button parece ter resolvido o problema. Quando retorna 0, 0, 0, retorna o botão correto do mouse (1 = esquerda, 3 = direita)

Tentei procurar soluções para isso, mas em todas as respostas parece que a pessoa não sabia ou esqueceu de incluir o evento em pg.event.get () .. a detecção do mouse no pygame parou de funcionar de forma confiável e eu ' Não tenho certeza se é um erro de hardware, meu código está ruim ou outra coisa. Aqui está uma versão simplificada do meu loop de jogo para o 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()

Mudei o botão principal do mouse para o else porque é a única maneira de tornar a ação mais importante mais confiável no momento, mas, ao imprimir o resultado do else, também descobri que um em cada 4 ou 5 cliques retorna (0, 0, 0) em vez de (1, 0, 0). Tentei diferentes formas de escrever a expressão, simplificando a estrutura, aumentando o relógio do Pygame e nada está funcionando.

Alguém encontrou isso e existe uma solução?

editar: Eu executei outro teste salvando o resultado get_pressed em uma variável imediatamente e ele ainda retorna 0, 0, 0, então tenho certeza de que seu estado não mudou de MOUESBUTTONDOWN para o momento em que é chamado.

Respostas

1 Rabbid76 Sep 19 2020 at 23:41

pygame.mouse.get_pressed()obtém o estado atual dos botões do mouse. O estado dos botões pode ter sido alterado, desde a ocorrência do evento do mouse. Observe que os eventos são armazenados em uma fila e você receberá os eventos armazenados posteriormente no aplicativo por pygame.event.get(). Enquanto isso, o estado do botão pode ter sido alterado por causa disso, o botão que causa o MOUSEBUTTONDOWNevento é armazenado no buttonatributo do pygame.event.Eventobjeto imediatamente. No loop de evento, quando você obtém o evento, o estado de event.buttone pygame.mouse.get_pressed()pode ser diferente.
O mesmo vale para pygame.mouse.get_pos(). A posição do mouse é armazenada no atributo posUse event.buttonand event.posao invés de pygame.mouse.get_pressed()e 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()e pygame.mouse.get_pressed()não se destinam a ser usados ​​no loop de eventos. As funções devem ser usadas diretamente no loop do aplicativo.