【问题标题】:Python time counter in Pygame-mouse eventsPygame鼠标事件中的Python时间计数器
【发布时间】:2015-03-07 07:31:09
【问题描述】:

我想在 Pygame 中计算用户鼠标事件的时间,如果用户在 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))

但是我该如何计算呢?我什至找不到如何告诉Python,用户的鼠标是否在同一个坐标上。那么我可以说,如果鼠标坐标发生变化,则启动计时器,如果大于15,则打印文本。

编辑:你可以假设它在没有 Pygame 模块的普通 Python 中,假设你有一个捕获鼠标事件的函数,那么如果鼠标坐标没有改变,如何告诉 Python,启动计时器,如果时间大于 15 秒,打印文本,然后刷新计时器。

【问题讨论】:

  • 您当前的代码无条件地将start = time.time()设置在循环的顶部,因此稍后计算的diff = end-start将始终是一个相对较小的数字。

标签: python python-3.x time pygame mouseevent


【解决方案1】:

你应该添加:

start = time.time()
cur = None

在while循环之前。

您还应该将 while 循环中的 start = time.time() 更改为:

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

您也可以使用pygame.time(它类似于time,但以毫秒为单位测量时间)

【讨论】:

  • 如果你想让你的程序正常工作,我回答了你需要做什么。
【解决方案2】:

如果 pygame 窗口内 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

【讨论】:

  • 我不介意投反对票,但我希望能得到解释。代码已经过测试,它会按照我所理解的描述来回答问题。
  • 是的,这正是我想要的,你能否对方法给出一个很好的解释,然后我可以在我的代码中进行操作
  • @importV 除了他们的文档(您是否尝试过阅读它?您需要帮助找到它吗?)以及代码中的现有 cmets 之外,哪些具体方法需要更多解释?
  • @importV:与您的问题变量相关的唯一变量是timernowdeadlinepygame.mouse.get_rel()。你了解它们是如何使用的吗?其余的与当前问题无关,但如果其他问题(与计时器无关)不清楚,请毫不犹豫地提出新问题(越具体的问题越好,但提供更一般的上下文和指向该问题的链接)。
  • 是的,请问您在回答中解释一下吗?
【解决方案3】:

在您的代码中,while True: 代码块一直在运行。 cur = pygame.mouse.get_pos() 函数是非阻塞的。这意味着它不会等待鼠标输入 - 它会立即返回。所以你需要在你的while True:代码块之前初始化startcur变量,然后在你的循环中不断检查鼠标的位置。

如果自上次循环运行以来cur 发生了变化,则将start 变量重置为当前时间,如果当前时间与start 之间的差异大于您的15 秒,您可以显示文本。

【讨论】:

    【解决方案4】:

    即使没有时间,您也可以这样做,因为您可以通过 FPS 将暂停时间计算为整数计数器。考虑以下示例。请注意,如果光标在窗口外,即使您移动光标,其位置的值也不会改变。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多