用计时器缓慢减少变量?

时间:2017-07-09 22:22:57

标签: python pygame

当用户按下按钮时,我的变量会增加。 当用户按下另一个按钮时,我想将该变量设置为0, 但不是立即 - 我希望它能在几秒钟内完成。 在此期间,我希望用户能够执行其他操作 - 这就是为什么我不使用睡眠。

我已经看过使用pygame的活动,time.clock等等,但我似乎无法让它发挥作用。这是我到目前为止所尝试的内容:

import pygame, sys, math
from pygame.locals import *

pygame.init()
pygame.font.init()
scrw = 640
scrh = 480
screen = pygame.display.set_mode((scrw, scrh))

ttwist = 0
recentering = False
fps = 15

clock = pygame.time.Clock()
my_font = pygame.font.SysFont("arial", 12)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pressed = pygame.key.get_pressed()

    if not recentering:
        if pressed[pygame.K_d]:
            ttwist +=1
        if pressed[pygame.K_a]:
            ttwist -=1   

    RECENTERTORSOEVENT = USEREVENT
    if event.type == pygame.KEYDOWN  and event.key == pygame.K_BACKSLASH:
        recentering = True
        pygame.time.set_timer(RECENTERTORSOEVENT, 1000*abs(ttwist))
        if ttwist == 0:
            recentering = False

    if event.type == USEREVENT:
       if ttwist < 0:
        ttwist += 1
       elif ttwist > 0:
        ttwist -= 1

    drawtext = my_font.render("TTWIST:"+str(ttwist), True, (255,255,255),(0,0,0))
    screen.blit(drawtext,(10,130))

    pygame.display.update()
    clock.tick(fps)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您走在正确的轨道上,但代码的某些部分需要更改:

  • 所有if event.type == ...块都应该在事件循环中。

  • RECENTERTORSOEVENT = USEREVENT应该在while循环之上定义(但这不会导致问题)。

  • 您正在设置RECENTERTORSOEVENT方式的时间间隔过高:1000*abs(ttwist)。这意味着,如果ttwist为10,则将其设置为10.000毫秒(10秒)。只需将其设置为100 ms的常量值。

  • 重新定位ttwist后,请致电pygame.time.set_timer(RECENTERTORSOEVENT, 0)停止计时器。

  • 每帧screen.fill((30, 30, 30))填充屏幕,否则您会看到工件,因为字体表面会不断改变其大小。

import sys
import pygame


pygame.init()
screen = pygame.display.set_mode((640, 480))
my_font = pygame.font.SysFont('arial', 22)
clock = pygame.time.Clock()

ttwist = 0
RECENTERTORSOEVENT = pygame.USEREVENT

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r:
                print('recentering')
                # Start to add the USEREVENT every 100 ms.
                pygame.time.set_timer(RECENTERTORSOEVENT, 100)
        elif event.type == RECENTERTORSOEVENT:
            ttwist += 1 if ttwist < 0 else -1
            if ttwist == 0:
                print('done')
                # Stop to add the USEREVENT to the queue.
                pygame.time.set_timer(RECENTERTORSOEVENT, 0)

    pressed = pygame.key.get_pressed()
    if pressed[pygame.K_d]:
        ttwist += 1
    if pressed[pygame.K_a]:
        ttwist -= 1

    screen.fill((30, 30, 30))
    drawtext = my_font.render(
        'TTWIST: {}'.format(ttwist), True, (255, 255, 255))
    screen.blit(drawtext, (10, 130))

    pygame.display.update()
    clock.tick(30)

ttwist += 1 if ttwist < 0 else -1是一个条件表达式,基本上与:

相同
if ttwist < 0:
    ttwist += 1
elif ttwist > 0:
    ttwist -= 1