2015-01-09 9 views
5

파이 게임에서 사용자의 마우스 이벤트 시간을 계산하고 싶습니다. 사용자가 마우스를 약 15 초 동안 움직이지 않으면 화면에 텍스트를 표시하고 싶습니다. 나는 그것에 대한 time 모듈을 시도했지만 작동하지 않습니다.파이 게임 마우스 이벤트의 파이썬 시간 카운터

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() 

출력 결과가 좋지 않아 사용자가 마우스를 움직이지 않으면 계산 방법을 모르겠습니다.

특수 영역에 사용자의 마우스가있을 때 텍스트를 쓰고 싶다면 다음과 같이 작동합니다.

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

하지만 어떻게 계산합니까? 나는 심지어 파이썬에게 말하는 방법을 찾지 못했다. 사용자의 마우스는 같은 좌표에있다. 그렇지 않으면 마우스 좌표가 바뀌면 타이머를 시작하고 15보다 큰 경우 텍스트를 인쇄한다.

편집 : 당신은, 당신은 마우스 이벤트를 잡기, 그럼 어떻게 마우스의 좌표가 변경되지 않는 경우, 파이썬에게 타이머를 시작하는 기능을 가지고 가정, 파이 게임 모듈없이 정상 파이썬을 가정 할 수있다 시간이 15 초보다 길면 텍스트를 인쇄 한 다음 타이머를 새로 고칩니다.

+0

현재 코드는 무조건'start = time '을 설정합니다.time()'을 루프의 최상위에 놓는다. 그래서 조금 늦게 계산 된'diff = end-start'는 항상 상대적으로 작은 숫자가 될 것이다. – martineau

답변

0

당신은 추가해야합니다 :

start = time.time() 
cur = None 

루프 동안 전합니다.

또한 루프에있는 동안에 start = time.time()을 변경해야합니다 : (이 time 비슷하지만 밀리 초 단위로 시간 측정) 또한

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

당신이 pygame.time을 사용할 수

+0

나는 정말로 당신의 요점을 이해하지 못합니다. –

+0

나는 당신이 당신의 프로그램을 원한다면 당신이해야 할 일에 대답했다. – knowledge

4

이 화면에 텍스트를 표시하려면를하는 경우가 파이 게임 창에서 3 초 동안 아무런 마우스 움직임이 없습니다 :

#!/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

나는 downvote 상관 없지만 설명을 주시면 고맙겠습니다. 코드는 테스트를 거쳤으며 설명에서 내가 이해하는 한 질문에 답하는 것을 말합니다. – jfs

+0

네,이게 내가 원하는 것 같아 excatly 방법에 대한 좋은 설명을 줄 수 제발 내 코드에서 manipula 수 있습니다 –

+0

@importV 어떤 구체적인 방법은 그들의 설명서를 넘어서 더 많은 설명이 필요합니까 (당신은 그것을 읽으려고 했습니까? 찾는 데 도움이됩니까?) 및 코드의 기존 주석? – jfs

0

코드에서 while True: 코드 블록이 계속 실행 중입니다. cur = pygame.mouse.get_pos() 함수는 비 차단입니다. 즉, 마우스 입력을 기다리지 않고 즉시 반환됩니다. 따라서 startcur 개의 변수 을 먼저 코드 블록 인 while True: 코드 블록으로 초기화 한 다음 반복적으로 루프에서 마우스 위치를 확인해야합니다. cur 루프가 실행 된 마지막 시간 이후 변경된 경우

는, 현재 시간으로 start 변수를 재설정하고 현재 시간과 start의 차이가 15초보다 크게 될 경우, 당신은 텍스트를 표시 할 수 있습니다.

0

FPS를 통해 정수 카운터로 일시 중지를 계산할 수 있기 때문에 시간을 들이지 않고도이 작업을 수행 할 수 있습니다. 다음 예제를 고려하십시오. 커서가 창 밖으로 나가면 커서를 움직여도 positon 값이 변경되지 않습니다.

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() 
관련 문제