“'pygame.Surface'对象的描述符'blit'需要一个参数”

时间:2019-10-08 17:57:04

标签: python pygame blit

你好,我正在尝试在pygame中创建一个rpg游戏 但是,每次我尝试运行代码进行测试时,都会告诉我 “'pygame.Surface'对象的描述符'blit'需要一个参数”

我相信我已经同意了这一论点。

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)

我希望它可以打开白屏。也许能够看到图片。但它所要做的就是告诉我blit需要争论。 当我告诉它找到图片的位置以及x和y坐标时,我以为我给了它一个论点

2 个答案:

答案 0 :(得分:0)

似乎您正在尝试学习如何用Python编写代码并同时使用Pygame库。我不建议这样做;首先学习更多代码编写基础知识。但我会尽力帮助您解决困惑:

  

但它所做的只是

正确;在启动过程中出现错误,因此它无法显示任何内容。

  

当我告诉它找到图片的位置以及x和y坐标时,我以为我给了一个论点

密钥位于单词descriptorobject中。 pygame.Surface是该类的 ,而blit是该类的 的方法,但是您试图像使用普通函数一样使用它。

您需要创建该类的实例,并使用其方法。您已经有这样一个实例:它称为screen,由pygame.display.set_mode创建。现在,我们可以例如screen.blit(playerimg, (x, y))

  

我之所以只把它放在这里是因为它告诉我在“ def player(x,y):”中定义了“ x”:

之所以发生这种情况,是因为您定义了player来接受xy的值,但是在函数的 out 代码中,您试图调用使用外部函数中的xy-不存在。请仔细研究示例:

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)

(再次;首先了解更多代码编写基础知识;然后,当发生这种情况以及为什么发生这种情况时,您将很明显,并且您将能够第一次对其进行正确修复,并了解为什么要进行正确的修复正确的。)

答案 1 :(得分:0)

pygame.Surface.blit是一个Method,第二个参数(dest)是一个包含2个组成部分的位置元组,因此必须为:

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

pygame.Surface.fill

screen.fill(white)

请注意,pygame.Surface对象上的操作.blit().fill()操作符。如果要fill显示屏或blit显示屏上的某物,则必须使用与显示屏关联的Surface。您的情况是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()