«дескриптору« blit »объекта« pygame.Surface »нужен аргумент» - PullRequest
1 голос
/ 08 октября 2019

Здравствуйте, я пытаюсь создать RPG-игру в Pygame. Однако, каждый раз, когда я пытаюсь запустить код для тестирования, он говорит мне «дескриптор« blit »объекта« pygame.Surface »нуждается в аргументе»

Я полагаю, что уже привел аргумент.

import pygame
import os
from pygame.locals import*

screen_width = 1900
screen_height = 1080

black = (0, 0, 0)
white = (255, 255 ,255)
red = (255, 0 ,0)
lime = (0, 255, 0)
blue = (255, 255, 0)
aqua = (0, 255, 255)
magenta = (255, 0, 255)
silver = (192, 192, 192)
gray = (128, 128, 128)
maroon = (128, 0, 0)
olive = (128, 128, 0)
green = (0, 128, 0)
purple = (128, 0, 128)
teal = (0, 128, 128)
navy = (0, 0, 128)

pygame.display.init()
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption('This is a rpg')
clock = pygame.time.Clock()

current_path = os.path.dirname('untitled')
resource_path = os.path.join(current_path, 'Characters')
character_path = os.path.join(resource_path, 'Knight')
image_path = os.path.join(character_path, 'Walk_Attack')

playerimg = pygame.image.load(os.path.join(character_path, 'knight.png'))

x = (screen_width * 0.45) 
# I only put it up here because it told me "x" wasent defined in "def player(x, y):"

y = (screen_height * 0.8)

def player(x, y):
    x = (screen_width * 0.45)
    y = (screen_height * 0.8)
    pygame.Surface.blit(source = playerimg, x = x, y = y)

dead = False

while not dead:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            dead = True
    player(x, y)
    pygame.Surface.fill(white)
    pygame.display.flip()
    clock.tick(60)
pygame.quit()
quit()

screen.fill(white)

Я ожидаю, что он откроется на белом экране. Может быть, сможет увидеть рис. но все, что он делает, говорит мне, что Блиту нужен аргумент. который, как мне показалось, привел в качестве аргумента, когда я сказал ему место, где нужно найти картинку, и это координаты x и y

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

pygame.Surface.blit - это метод , а второй параметр (dest) - это кортеж позиции с двумя компонентами, поэтому он должен быть:

screen.blit(source = playerimg, dest = (x, y))

То же самое относится к pygame.Surface.fill

screen.fill(white)

Обратите внимание, что оператор .blit() и .fill() операций над объектом pygame.Surface. Если вы хотите fill дисплей или blit что-то на дисплее, то вы должны использовать поверхность, которая связана с дисплеем. В вашем случае это screen;

screen = pygame.display.set_mode([screen_width, screen_height])

В качестве альтернативы вы можете сделать:

pygame.Surface.blit(screen, playerimg, (x, y))

соответственно

pygame.Surface.fill(screen, white)

Кроме того, вы должны нарисовать player, после очистки дисплея и до обновления дисплея:

screen.fill(white)
player(x, y)
pygame.display.flip()
0 голосов
/ 08 октября 2019

Похоже, вы пытаетесь научиться писать код на Python и одновременно использовать библиотеку Pygame. Я не рекомендую это;сначала изучите некоторые основы написания кода. Но я постараюсь помочь с вашей путаницей:

но все, что он делает, это

Верно;во время запуска произошла ошибка, поэтому она пока ничего вам не показывает.

, что, как мне показалось, я привел в качестве аргумента, когда сказал ему место, где нужно найти картинку и ее xи координаты y

Ключ в словах descriptor и object. pygame.Surface - это класс , а blit - это метод этого класса, но вы пытаетесь использовать его какесли бы это была простая функция.

Вам необходимо создать экземпляр класса и использовать его методы. У вас уже есть такой экземпляр: он называется screen, и он был создан pygame.display.set_mode. Так что теперь мы можем, например, screen.blit(playerimg, (x, y)).

Я только поднял это здесь, потому что он сказал мне "x" wasent, определенный в "def player (x, y):"

Это произошло потому, что вы определили player для принятия значений x и y, но в коде вне функции вы пытались вызвать ее используя x и y из за пределами функцию - которой не было. Пожалуйста, внимательно изучите пример:

def player(x, y):
    # We don't need to define x and y inside, because they will be given to us
    # if we do assign some values, it replaces what we were passed in.
    # This is bad, because the point is to let the outside code decide.
    print(f"I was passed in: x = {x}, y = {y}")

x = 1
y = 2
# this requires the above; it has nothing to do with x and y inside the function.
player(x, y)

# but we can use different names:
a = 1
b = 2
player(a, b)

# or no names at all:
player(1, 2)

(Опять же; сначала изучите основы написания кода; тогда вам будет очевидно, когда что-то подобное произойдет и почему, и вы сможете исправить это правильно. , первый раз, и поймите, почему правильное исправление правильное.)

...