TypeError: аргумент 1 должен быть pygame.Surface, а не pygame.Rect в моей игре Python

Хорошо, поэтому я пытаюсь сделать прямоугольник, который может прыгать на экране, однако всякий раз, когда я запускаю программу, я получаю эту ошибку:

Traceback (most recent call last):
  File "Z:/Programming Projects/Learning/Basic Game.py", line 102, in <module>
    drawGameWindow()
  File "Z:/Programming Projects/Learning/Basic Game.py", line 72, in drawGameWindow
    win.blit(player.sprite, player.x_position, player.y_position)
TypeError: argument 1 must be pygame.Surface, not pygame.Rect

Я понимаю, о чем это говорит, что я не могу использовать Rect для копирования и изображения в окно, и что я должен использовать Surface, но я не уверен, как это сделать, даже после просмотра документации. Как мне решить эту проблему?

Мой код:

# Imports--------------------------------------------------------------------------------------------------------------#

import pygame


# initialization-------------------------------------------------------------------------------------------------------#

pygame.init()

# Flags----------------------------------------------------------------------------------------------------------------#

gameExit = False

# Variables -----------------------------------------------------------------------------------------------------------#

display_height = 500
display_width = 500
bg = (0, 0, 0)
isJump = False
# Colors --------------------------------------------------------------------------------------------------------------#

FUCHSIA = (255, 0, 255)
PURPLE = (128, 0, 128)
TEAL = (0, 128, 128)
LIME = (0, 255, 0)
GREEN = (0, 128, 0)
OLIVE = (128, 128, 0)
YELLOW = (255, 255, 0)
ORANGE = (255, 165, 0)
RED = (255, 0, 0)
MAROON = (128, 0, 0)
SILVER = (192, 192, 192)
GRAY = (128, 128, 128)
BLUE = (0, 0, 255)
NAVY = (0, 0, 128)
AQUA = (0, 255, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Draw Screen----------------------------------------------------------------------------------------------------------#

win = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption("Airbender Training")
Clock = pygame.time.Clock()

# Mobs ----------------------------------------------------------------------------------------------------------------#
class entity:
    #Entities will be every mob in the game
    def __init__(self, width, height, velocity, x, y, sprite):

        entity.width = width
        entity.height = height
        entity.velocity = velocity
        entity.x_position = x
        entity.y_position = y
        entity.sprite = sprite

player_width = 64
player_height = 64
player_velocity = 5
player_x_position = 5
player_y_position = 5
player_sprite = pygame.draw.rect(win, RED, (player_x_position, player_y_position, player_width, player_height))
    # ^This makes a placeholder red square^
player = entity(player_width, player_height, player_velocity, player_x_position, player_y_position, player_sprite)

# Functions -----------------------------------------------------------------------------------------------------------#

def drawGameWindow():

    win.fill(bg)
    win.blit(player_sprite, player.x_position, player.y_position)
    Clock.tick(60)
    pygame.display.update()

def jump():

    jumpCount = 1
    while jumpCount <= entity.height * 1.5:
        entity.y_position += jumpCount
        jumpCount += 1
    while jumpCount >= entity.height * 1.5:
        entity.y_position -= jumpCount
        jumpCount -= 1

# Main Loop------------------------------------------------------------------------------------------------------------#

while not gameExit:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            gameExit = True
        if event.type == pygame.KEYDOWN:
            if event == pygame.k_RIGHT or event == pygame.k_D:
                player.x_position += 5
            if event == pygame.k_LEFT or event == pygame.k_A:
                player.x_position -= 5
            while not isJump:
                if event == pygame.k_up or event == pygame.k_SPACE:
                    jump(player)

    drawGameWindow()

pygame.quit()

Возможный дубликат Преобразование прямоугольника в поверхность в pygame

DWuest 28.01.2019 15:33
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
567
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Ошибка вызвана той же проблемой, что и ошибка в вопросе: Преобразование прямоугольника в поверхность в pygame - эта часть дублируется.

Но чтобы решить эту проблему, нужно сделать еще немного:

1-й параметр blit() должен быть pygame.Surface, а 2-й должен быть позицией. Позиция представляет собой кортеж, состоящий из координат x и y.

Создайте Surface вместо рисования прямоугольника на поверхности и залейте поверхность цветом RED:

player_sprite = pygame.draw.rect(win, RED, (player_x_position, player_y_position, player_width, player_height))

player_sprite = pygame.Surface((player_width, player_height))
player_sprite.fill(RED)

2-й параметр — это кортеж:

win.blit(player_sprite, player.x_position, player.y_position)

win.blit(player_sprite, (player.x_position, player.y_position))       

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