当某个命令为真时,如何更新 python pygame 中的文本?

How do I update the text in python pygame when a certain command is true?

我正在尝试构建一个 space 类似入侵者的游戏,只是为了好玩。 大部分都完成了,但是当我射击敌人时,我希望屏幕上的文字显示他的生命值减少。

这是我的代码,仅包含健康更新部分:

import pygame
from sys import exit

enemy_health = 10

pygame.init()
win = pygame.display.set_mode((1000, 1000))
pygame.display.set_caption("Fighter Pilot Go!")
clock = pygame.time.Clock()

font = pygame.font.Font(None, 55)
enemy_health_text = font.render(f'Enemy Health: {enemy_health}', False, 'white')

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                enemy_health_text -= 1

    win.blit(enemy_health_text, (350, 60)

这不是游戏的全部,但这是基本理念。 在激光击中敌人之前,游戏中的分数不会更新。

这是整个游戏,如果代码可以帮助您理解我的问题:

import pygame
from sys import exit
import random

speed = 5
laser_speed = 7
bullets = []
score = 0
max_num_of_bullet = 3
background_speed = 3
enemy_health = 10
direction = True
enemy_speed = 7

pygame.init()
win = pygame.display.set_mode((1000, 1000))
pygame.display.set_caption("Fighter Pilot Go!")
clock = pygame.time.Clock()

background1 = pygame.image.load('assets/background.gif')
background2 = pygame.image.load('assets/background.gif')
background1_rect = background1.get_rect(topleft=(0, 0))
background2_rect = background2.get_rect(topleft=(0, -1000))

player = pygame.image.load('assets/player.gif')
player_rect = player.get_rect(midtop=(500, 750))

enemy = pygame.image.load('assets/enemy.gif')
enemy_rect = enemy.get_rect(center=(500, 350))

laser = pygame.image.load('assets/laser.gif')
# laser_rect = laser.get_rect(midtop=(500, 800))

font = pygame.font.Font(None, 55)
enemy_health_text = font.render(f'Enemy Health: {enemy_health}', False, 'white')


def is_collided_with(a, b):
    return abs(a[0] - b.centerx) < 51 and abs(a[1] - b.centery) < 51



while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                if len(bullets) <= max_num_of_bullet - 1:
                    bullets.append([player_rect.x + 49, player_rect.y - 60])
                elif len(bullets) > max_num_of_bullet - 1:
                    continue
                else:
                    print("Something Weird is Happening!")

    key = pygame.key.get_pressed()
    if key[pygame.K_a]:
        player_rect.x -= speed
    if key[pygame.K_d]:
        player_rect.x += speed

    win.blit(background1, background1_rect)
    win.blit(background2, background2_rect)
    win.blit(player, player_rect)
    win.blit(enemy, enemy_rect)

    background1_rect.y += background_speed
    background2_rect.y += background_speed

    if direction:
        enemy_rect.x -= enemy_speed
    elif not direction:
        enemy_rect.x += enemy_speed

    if enemy_rect.x <= 0:
        direction = False
    elif enemy_rect.x >= 900:
        direction = True

    if player_rect.x < -20:
        player_rect.x = 1020
    if player_rect.x > 1020:
        player_rect.x = -20

    for bullet in bullets:
        win.blit(laser, bullet)

    for bullet in bullets:
        bullet[1] -= laser_speed

    win.blit(enemy_health_text, (350, 60))

    for bullet in bullets:
        if is_collided_with(bullet, enemy_rect):
            bullets.remove(bullet)
            enemy_health -= 1

    for bullet in bullets:
        if bullet[1] < 0:
            bullets.remove(bullet)

    if background1_rect.y >= 1000:
        background1_rect.topleft = (0, -1000)
    if background2_rect.y >= 1000:
        background2_rect.topleft = (0, -1000)

    if enemy_health <= 0:
        pass


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

如有任何帮助,我们将不胜感激。 :) 谢谢!

文本在 enemy_health_text Surface 中呈现,值为 enemy_health。您必须更改 enemy_health 并再次呈现文本:

font = pygame.font.Font(None, 55)
enemy_health_text = font.render(f'Enemy Health: {enemy_health}', False, 'white')

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                enemy_health -= 1
                enemy_health_text = font.render(f'Enemy Health: {enemy_health}', False, 'white')

    win.fill(0)
    win.blit(enemy_health_text, (350, 60)
    pygame.display.flip()