2015-01-09 26 views
5

Ich möchte die Zeit der Mausereignisse des Benutzers in Pygame berechnen, wenn Benutzer seine Maus nicht über 15 Sekunden bewegt, dann möchte ich einen Text auf dem Bildschirm anzeigen. Ich habe versucht time Modul dafür, aber es funktioniert nicht.Python-Zeitzähler in Pygame-Mausereignisse

import pygame,time 

pygame.init() 

#codes 
... 
... 

font = pygame.font.SysFont(None,25) 
text = font.render("Move your mouse!", True, red) 

FPS = 30 

while True: 
    #codes 
    ... 
    ... 
    start = time.time() 
    cur = pygame.mouse.get_pos() #catching mouse event 
    end = time.time() 
    diff = end-start 
    if 15 < diff: 
     gameDisplay.blit(text,(10,500)) 

    pygame.display.update() 

    clock.tick(FPS) 

pygame.quit() 
quit() 

Nun Ausgang ist nicht, was ich will, ich weiß nicht, wie es zu berechnen, wenn Benutzer seine Maus nicht bewegt.

Wenn ich einen Text schreiben möchte, wenn Maus des Benutzers in einem speziellen Bereich, funktioniert es wie;

if 100 < cur[0] < 200 and 100 < cur[1] < 200: 
     gameDisplay.blit(text,(10,500)) 

Aber wie kann ich berechnen? Ich konnte sogar nicht herausfinden, wie man Python sagt, die Maus des Benutzers ist auf den gleichen Koordinaten oder nicht. Dann kann ich sagen, wenn Mauskoordinaten Änderungen, starten Sie den Timer, und wenn es größer als 15 ist, drucken Sie den Text.

Edit: Sie können es in normalen Python ohne Pygame Modul übernehmen, vorausgesetzt, dass Sie eine Funktion haben, dass die Mausereignisse zu kontrollieren, dann, wie Python zu sagen, ob Koordinaten der Maus, um den Timer nicht ändern starten, Wenn die Zeit größer als 15 Sekunden ist, drucken Sie einen Text und aktualisieren Sie den Timer.

+0

Ihr aktueller Code setzt bedingungslos 'start = time.time() 'an der Spitze der Schleife, so dass das später berechnete" diff = end-start "immer eine relativ kleine Zahl ist. – martineau

Antwort

0

sollten Sie fügen:

start = time.time() 
cur = None 

vor while-Schleife.

Sie sollten auch start = time.time() in verändern while-Schleife:

if cur != pygame.mouse.get_pos(): 
    start = time.time() 

Auch Sie könnten pygame.time verwenden (es ist ähnlich wie time aber die Zeit in Millisekunden gemessen wird)

+0

Ich verstehe deinen Standpunkt wirklich nicht. –

+0

Ich antwortete, was Sie tun müssen, wenn Sie Ihr Programm arbeiten möchten. – knowledge

4

auf dem Bildschirm einen Text anzuzeigen, wenn es ist keine Mausbewegung innerhalb des Pygame-Fensters für 3 Sekunden:

#!/usr/bin/python 
import sys 
import pygame 

WHITE, RED = (255,255,255), (255,0,0) 
pygame.init() 
screen = pygame.display.set_mode((300,200)) 
pygame.display.set_caption('Warn on no movement') 

font = pygame.font.SysFont(None, 25) 
text = font.render("Move your mouse!", True, RED, WHITE) 

clock = pygame.time.Clock() 
timer = pygame.time.get_ticks 
timeout = 3000 # milliseconds 
deadline = timer() + timeout 
while True: 
    now = timer() 
    if pygame.mouse.get_rel() != (0, 0): # mouse moved within the pygame screen 
     deadline = now + timeout # reset the deadline 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 

    screen.fill(WHITE) 
    if now > deadline: # no movement for too long 
     screen.blit(text, (10, 50)) 

    pygame.display.flip() 
    clock.tick(60) # set fps 
+0

Ich habe nichts gegen den Downvote, aber ich würde eine Erklärung zu schätzen wissen. Der Code ist getestet und es tut was seine Beschreibung sagt, die die Frage so weit wie ich verstehe beantwortet. – jfs

+0

Ja das ist excatly was ich will, können Sie eine gute Erklärung über Methoden geben, dann kann ich es in meinen Codes manipulieren –

+0

@importV welche spezifischen Methoden erfordern mehr Erklärung über ihre Dokumentation (haben Sie versucht, es zu lesen? Brauchen Sie? Hilfe finden?) und die vorhandenen Kommentare im Code? – jfs

0

In Ihrem Code, der while True: Codeblock wird kontinuierlich ausgeführt. Die cur = pygame.mouse.get_pos() Funktion ist nicht blockierend. Dies bedeutet, dass es nicht auf Mauseingabe wartet - es wird sofort zurückkehren. Sie müssen also die start und cur Variablen vor Ihren while True: Codebaustein initialisieren und dann die Mausposition ständig in Ihrer Schleife überprüfen.

Wenn cur seit dem letzten Mal geändert hat die Schleife lief, dann setzen Sie die start Variable auf die aktuelle Zeit, und wenn die Differenz zwischen der aktuellen Zeit und start größer wird als der 15 Sekunden können Sie den Text angezeigt werden soll.

0

Sie können das auch ohne Zeitaufwand tun, da Sie die Pause als ganzzahligen Zähler über Ihre FPS berechnen können. Betrachten Sie folgendes Beispiel. Wenn sich der Cursor außerhalb des Fensters befindet, ändern sich die Werte seiner Position nicht, selbst wenn Sie den Cursor bewegen.

import pygame 

pygame.init() 
clock = pygame.time.Clock() 
DISP = pygame.display.set_mode((600, 400)) 

FPS = 25 
Timeout = 15 
Ticks = FPS*Timeout  # your pause but as an integer value 
count = 0    # counter 
MC = pygame.mouse.get_pos() 
MC_old = MC 

MainLoop = True 
while MainLoop : 
    clock.tick(FPS) 
    pygame.event.pump() 
    Keys = pygame.key.get_pressed() 
    if Keys[pygame.K_ESCAPE]: 
     MainLoop = False 

    MC = pygame.mouse.get_pos()  # get mouse position 
    if (MC[0]-MC_old[0] == 0) and (MC[1]-MC_old[1] == 0) : 
     count = count + 1 
    else : count = 0 
    if count > Ticks : 
     print "What are you waiting for" 
     count = 0 
    MC_old = MC    # save mouse position 

    pygame.display.flip() 

pygame.quit()