mouse.get_pressed () inconsistente / retornando (0, 0, 0)
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
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.