当用户按下按钮时,我的变量会增加。 当用户按下另一个按钮时,我想将该变量设置为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)
我做错了什么?
答案 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