从 class 构造函数在 pygame 中绘制精灵

drawing sprite in pygame from a class constructor

import pygame

pygame.init()

class PlayerNinja(pygame.sprite.Sprite):

x = 0
y = 0
width = 112
height = 102


def __init__(self, x, y):
    self.x = x
    self.y = y
    super(PlayerNinja, self).__init__()

    self.image = pygame.image.load("player.png")

.
.
.


###########################################################################

def main():

    from PlayerNinja import *

    print "Testing"

    player = PlayerNinja(10, 10)
    a = player.getX()
    print "X: " + str(a)

    player.setX(50)
    b = player.getX()
    print "new X: " + str(b)

    player.setY(50)
    c = player.getY()
    print "Y: " + str(c)

    screenWidth = 800
    screenHeight = 700

    screen = pygame.display.set_mode((screenWidth, screenHeight))

    white = (255,255,255)
    done = False

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

        screen.fill(white)

        screen.blit(player, (b, c))

        pygame.display.flip()

if __name__ == "__main__": main()

当我 运行 main 时,我得到错误

screen.blit(player, b, c)
TypeError: argument 1 must be pygame.Surface, not PlayerNinja"

我尝试用 pygame.Surface 替换部分行。当我使用具有不同字符的相同格式 (screen.blit(player, (x,y))) 时,它起作用了……我认为这是因为在这种情况下,我将图像加载到 class 的构造函数中,而另一次我没有使用 class。我不得不查找 super().__init__() 部分,所以也许这是其中的一部分?

你需要编码

screen.blit(player.image, (b, c))

因为 .blit method need a pyagme.Surface-object(加载的图像也是 PyGame 中的表面)作为第一个参数。您需要将表面实例传递给 .blit(),它作为属性 self.image.

存储在您的 PlayerNinja 精灵对象 ("player") 中

其他部分(super().__init__())我觉得还不错。 :)