为了账号安全,请及时绑定邮箱和手机立即绑定

“if”命令只运行一次,不重复

“if”命令只运行一次,不重复

翻过高山走不出你 2023-06-20 16:13:36
我是 python 和 Pygame 的新手,正在尝试创建游戏。我希望在设定的时间后出现“通电”,然后每次计时器达到这么多秒时重复一次。代码中,出现“powerup”并在5秒后落下屏幕,定时器重置,但下一次定时器达到5秒时,继续计数,不再产生“powerup”。我花了几个小时试图找出为什么这不起作用。import pygameimport randomWIDTH = 480HEIGHT = 600FPS = 60WHITE = (255, 255, 255)BLACK = (0, 0, 0)GREEN = (0, 255, 0)pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))clock = pygame.time.Clock()time_difference = 0font_name = pygame.font.match_font('arial')def draw_text(surf, text, size, x, y):    font = pygame.font.Font(font_name, size)    text_surface = font.render(text, True, WHITE)    text_rect = text_surface.get_rect()    text_rect.midtop = (x, y)    surf.blit(text_surface, text_rect)class HealthPack(pygame.sprite.Sprite):    def __init__(self):        pygame.sprite.Sprite.__init__(self)        self.image = pygame.Surface((50, 40))        self.image.fill(GREEN)        self.rect = self.image.get_rect()        self.radius = 50        self.rect.x = random.randrange(WIDTH - self.rect.width)        self.rect.y = random.randrange(-150, -100)        self.speedy = 6        self.speedx = 0    def update(self):        self.rect.y += self.speedy        if self.rect.top > HEIGHT:            self.kill()all_sprites = pygame.sprite.Group()healthpack = HealthPack()running = Truewhile running:    clock.tick(FPS)    time_difference = pygame.time.get_ticks()    if time_difference >= 5000:        all_sprites.add(healthpack)        time_difference -= 5000    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False    all_sprites.update()    screen.fill(BLACK)    all_sprites.draw(screen)    draw_text(screen, str(time_difference), 18, WIDTH / 2, 55)    pygame.display.flip()pygame.quit()
查看完整描述

2 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

您不是在计算自上次以来的时差powerup。time_difference始终是游戏开始后的时间。每次要重置计时器时都需要保存滴答声,并与之进行比较。


prev_time = pygame.time.get_ticks() #initialize tick counter

while running:

    clock.tick(FPS)

    time_difference = pygame.time.get_ticks() - prev_time

    if time_difference >= 5000:

        all_sprites.add(healthpack)

        prev_time = pygame.time.get_ticks() # reset counter

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            running = False


    all_sprites.update()


    screen.fill(BLACK)

    all_sprites.draw(screen)

    draw_text(screen, str(time_difference), 18, WIDTH / 2, 55)


    pygame.display.flip()


查看完整回答
反对 回复 2023-06-20
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

他对 的修复是正确的time_difference,但您的代码也存在另一个问题。


另一个问题是healthpack. 你正在这样做all_sprites.add(healthpack),这只会把旧的healthpack放回列表中all_sprites。那个精灵离开屏幕并下降。你需要一个新的实例HealthPack。所以你需要像这样修改@Barmar的解决方案:


prev_time = pygame.time.get_ticks() #initialize tick counter

while running:

    clock.tick(FPS)

    time_difference = pygame.time.get_ticks() - prev_time

    if time_difference >= 5000:

        healthpack = HealthPack()      # <-----------------   add this line

        all_sprites.add(healthpack)

        prev_time = pygame.time.get_ticks() # reset counter


查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信