TypeError: текст должен быть в юникоде или байтах и ​​как сделать работающую пулю в pygame

Я делаю космических захватчиков. Вот мой код:

# importing packages
import pygame
# Initializing Pygame
pygame.init()

# Setting a display caption
pygame.display.set_caption("Space Invaders")

spaceship = pygame.image.load("spaceship2.png")
blue_enemy = pygame.image.load("blue_enemy.png")
green_enemy = pygame.image.load("green_enemy.png")
orange_enemy = pygame.image.load("orange_enemy.png")
pink_enemy = pygame.image.load("pink_enemy.png")
yellow_enemy = pygame.image.load("yellow_enemy.png")

# Creating a font
pygame.font.init()
font = pygame.font.SysFont("consolas", 30)

# Setting a display width and height and then creating it
display_width = 700
display_height = 500
display_size = [display_width, display_height]
game_display = pygame.display.set_mode(display_size)


# Creating a way to add text to the screen
def message(sentence, color, x, y, font_type, display):
    sentence = font_type.render(sentence, True, color)
    display.blit(sentence, [x, y])


def main():
    # Spaceship coordinates
    spaceship_x = 300
    spaceship_y = 375
    spaceship_x_change = 0
    # Enemy health
    blue_enemy_health = 5
    green_enemy_health = 5
    orange_enemy_health = 5
    pink_enemy_health = 5
    yellow_enemy_health = 5

    # Initializing pygame
    pygame.init()

    # Creating colors
    black = (0, 0, 0)
    red = (0, 0, 0)

    done = False

    # Creating a loop to keep the program running
    while not done:

        # --- Event Processing and controls
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    spaceship_x_change = 7
                elif event.key == pygame.K_LEFT:
                    spaceship_x_change = -7
                elif event.key == pygame.K_r:
                    red = (255, 0, 0)
            elif event.type == pygame.KEYUP:
                spaceship_x_change = 0
                red = (0, 0, 0)

        spaceship_x += spaceship_x_change

        # Preventing the spaceship from going off the screen
        if spaceship_x > display_width - 140:
            spaceship_x -= 10
        if spaceship_x < 1:
            spaceship_x += 10

        # Setting Display color
        game_display.fill(black)

        # Creating a spaceship, bullets, and enemies
        pygame.draw.rect(game_display, red, [spaceship_x + 69, 70, 4, 310])
        game_display.blit(spaceship, (spaceship_x, spaceship_y))
        message(blue_enemy_health, (255, 255, 255), 350, 250, font, game_display)
        game_display.blit(blue_enemy, (20, 25))
        game_display.blit(green_enemy, (160, 25))
        game_display.blit(orange_enemy, (300, 25))
        game_display.blit(pink_enemy, (440, 25))
        game_display.blit(yellow_enemy, (580, 25))

        # Updating Screen so changes take places
        pygame.display.update()

        # Setting FPS
        FPS = pygame.time.Clock()
        FPS.tick(60)


# Executing the function
if __name__ == "__main__":
    main()

Однако, когда я хочу отобразить здоровье своего врага, он показывает мне эту ошибку. Я не знаю, что с этим делать, пожалуйста, помогите. Также я использую неудобный «лазер», которым стреляет космический корабль. Я выбрал это как ярлык для создания пуль, так как я новичок в pygame. Если можете, помогите и с этим.

Ошибка:

Traceback (most recent call last):
  File "C:/Users/admin/PycharmProjects/ProgrammingLearn/SpaceInvaders.py", line 103, in <module>
    main()
  File "C:/Users/user/PycharmProjects/ProgrammingLearn/SpaceInvaders.py", line 86, in main
    message(blue_enemy_health, (255, 255, 255), 350, 250, font, game_display)
  File "C:/Users/user/PycharmProjects/ProgrammingLearn/SpaceInvaders.py", line 30, in message
    sentence = font_type.render(sentence, True, color)
TypeError: text must be a unicode or bytes

Изменение его на sentence = font_type.render(str.encode(sentence), True, color) должно работать, так как оно преобразует sentence в строку байтов.

Abhinav Mathur 12.12.2020 19:42

@AbhinavMathur спасибо. попытаюсь

hmood 12.12.2020 19:50

Просто сделай message(str(blue_enemy_health), (255, 255, 255), 350, 250, font, game_display)

Rabbid76 12.12.2020 20:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
219
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первым аргументом font_type.render должна быть строка, и вы передаете int в параметр sentence (вы передаете blue_enemy_health целое число). Вам нужно преобразовать его в строку, прежде чем отображать его со шрифтом с помощью str(blue_enemy_health), когда вы передаете его в функцию message.

Другие вопросы по теме