2016-05-03 1 views
1

J'essaie d'implémenter un jeu en utilisant la position de la souris pour voir si l'utilisateur clique sur un bouton. D'une certaine manière, la position de la souris ne se met pas à jour pendant quelques secondes, et change pour une nouvelle position pendant encore quelques secondes, et répète. J'ai bougé et j'ai appuyé sur la souris à différents endroits de l'écran, mais la position de la souris n'a pas changé du tout. (Travailler sur python3.5.1 et pygame 1.9.2, en utilisant IDE PyCharm) Une idée? Voici mon code:Position de la souris Python Pygame ne pas mettre à jour

done = False 
while not done: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 
    mouse = pygame.mouse.get_pos() 
    click = pygame.mouse.get_pressed() 
    if click[0]==1: 
     print(mouse) 
    pygame.display.update() 
+0

cliquez-vous dans une fenêtre pygame? –

Répondre

-1

Votre

mouse = pygame.mouse.get_pos() 
click = pygame.mouse.get_pressed() 

seulement obtenir les états au moment de l'appel. Selon la documentation http://www.pygame.org/docs/ref/mouse.html:

pour obtenir tous les événements de la souris, il est préférable d'utiliser soit pygame.event.wait() ou pygame.event.get() et vérifier tous ces événements

C'est à dire qu'il vous manque les clics parce que votre programme ne les stocke pas à traiter. Vous ne le voyez que lorsque vous avez de la chance et le programme appelle la fonction quand le bouton est réellement enfoncé.

+1

J'ai changé mon code: pour l'événement dans pygame.event.get(): si event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() .. J'ai toujours le même problème. – lanlan2271

0

Il y a deux façons de gérer les événements d'entrée dans pygame:

  • Etat Contrôle
  • Event Handling

Pour mieux comprendre comment cela fonctionne: http://www.pygame.org/docs/tut/newbieguide.html#managing-the-event-subsystem

Vous utilisez les deux dans votre code, vérification d'état:

mouse = pygame.mouse.get_pos() 
click = pygame.mouse.get_pressed() 

gestion de l'événement:

for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

Si vous voulez continuer à utiliser l'état de vérification pour obtenir la position de la souris, vous pouvez ajouter:

clock=pygame.time.Clock() 
clock.tick(60) # 60 frames per second 

donc la mise à jour de la situation devrait être mieux.

+0

Merci! J'ai ajouté l'horloge, mais la position de la souris a encore changé très lentement. Quoi d'autre pourrait-être faux? – lanlan2271

0

Si le bouton a une rect alors vous pouvez utiliser la méthode rect.collidepoint() avec l'événement de vérification comme ceci:

mouse_pos = pygame.mouse.get_pos() 

    if event.type == pygame.MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0] and button.rect.collidepoint(mouse_pos): 
-1

Cela montre une souris de base pygame obtenir le programme. Il suffit de cliquer n'importe où dans la fenêtre et la souris sont coordonnées imprimées:

import pygame as py 

py.init() 

white = (255,255,255) 

window = (400,400) 
screen = py.display.set_mode(window) 

clock = py.time.Clock() 

done = False 
while not done: 
    for event in py.event.get(): 
     if event.type == py.QUIT: 
      done = True 
     elif event.type == py.MOUSEBUTTONDOWN: 
      print py.mouse.get_pos() 
    screen.fill(white) 
    py.display.flip() 
    clock.tick(30) 

py.quit() 

espérons que cette aide :)

+1

Avez-vous une idée pourquoi ce code exact ne fonctionnerait pas correctement avec PyGame 1.9.2a0 sur Python 3.5.2 via Anaconda sur OS X El Capitan? Cela 'fonctionne', mais ne met à jour la position de la souris que si je clique plusieurs fois sur ET déplace la souris. Sinon, il continue de signaler la même position, peu importe où je clique. Voir ici pour un gif du comportement: [link] (https://dl.dropboxusercontent.com/u/1049625/OddBehaviorPygameMouse.gif) – TSeymour

1

L'appel

mouse = pygame.mouse.get_pos() 

ne met pas à jour la position à moins que l'événement est exécuté MouseMotion .Si vous exécutez le programme dans une fenêtre sur un MAC, la souris doit être pressée, maintenue et déplacée (si vous deviez appuyer, maintenir, puis déplacer la souris, pygame.mouse.get_pos() retournerait la position actuelle de la souris).

+0

Vraiment? Pourquoi ne dit rien sur ce comportement dans les docs? https://www.pygame.org/docs/ref/mouse.html#pygame.mouse.get_pos Je peux confirmer que cela fonctionne comme vous le décrivez. Ce comportement est-il différent sur une machine Windows? – allcaps