在背景blit代码中在Pygame中创建的TypeError

时间:2017-05-27 06:38:29

标签: python pygame python-3.6

我正在尝试将背景图像blit到屏幕上,但是,我似乎继续遇到这个错误:

TypeError: unbound method update() must be called with Background instance as first argument (got nothing instead)

错误消息指向这行代码:

Background.update()

我试过在类的外部和内部移动blit,但同样的错误信息不断出现。我的猜测是,这也会影响船码。

这是整个py文件:

import pygame
from pygame.locals import *

# Colors
RED     = (255,0,0)
GREEN   = (0,255,0)
BLUE    = (0,0,255)

# Screen Size
SCREEN_X = 400
SCREEN_Y = 400

# Loading Images
background = pygame.image.load('StarBackground.png')
powership = pygame.image.load('PowerShip.png')

class Ship(pygame.sprite.Sprite):

    # Movement rate of change
    change_x = 0
    change_y = 0

    # Methods
    def __init__(self):

        # Starts the parent's constructor
        pygame.sprite.Sprite.__init__(self)

        # Sets the ship's image
        self.image = powership

        # Sets the ship's rect
        self.rect = self.image.get_rect()

        # Set the ship's start location
        self.rect.x = 0
        self.rect.y = 0

    def move_right(self):
        self.change_x = 1

    def move_left(self):
        self.change_x = 1

    def move_up(self):
        self.change_y = 1

    def move_down(self):
        self.change_y = 1

    def stop_x(self):
        self.change_x = 0

    def stop_y(self):
        self.change_y = 0

    def update(self, screen):
        self.rect.x += self.change_x
        self.rect.y += self.change_y

        screen.blit(self.image,self.rect)

class Background(pygame.sprite.Sprite):

    def __init__(self):

        # Starts the parent's constructor
        pygame.sprite.Sprite.__init__(self)

        # Sets the ship's image
        self.image = background

        # Sets the ship's rect
        self.rect = self.image.get_rect()

        # Sets the background's starting location
        self.rect.x = 0
        self.rect.y = 0

    def update(self, screen):

        screen.blit(self.image,self.rect)

def main():
    pygame.init()

    # Set the height and width of the screen
    size = [SCREEN_X, SCREEN_Y]
    screen = pygame.display.set_mode(size)

    pygame.display.set_caption("Space Adventure")

    # Creating the game objects
    background = Background()
    ship = Ship()

    # Close button exit code
    finished = False

    # Manages the frames per second
    clock = pygame.time.Clock()

    # Game loop
    while not finished:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                finished = True

            keyboardInput = pygame.key.get_pressed()

            if event.type == pygame.KEYDOWN:
                if keyboardInput[K_RIGHT]:
                    ship.move_right()
                if keyboardInput[K_LEFT]:
                    ship.move_left()
                if keyboardInput[K_UP]:
                    ship.move_up()
                if keyboardInput[K_DOWN]:
                    ship.move_down()

            if event.type == pygame.KEYUP:
                if keyboardInput[K_RIGHT]:
                    ship.stop_x()
                if keyboardInput[K_LEFT]:
                    ship.stop_x()
                if keyboardInput[K_UP]:
                    ship.stop_y()
                if keyboardInput[K_DOWN]:
                    ship.stop_y()

            clock.tick(60)
            pygame.display.flip()
            Background.update()
            Ship.update()

    pygame.quit()

if __name__ == "__main__":
    main()

编辑:将更新代码更改为以下内容解决了问题:

Background.update(screen)
Ship.update(screen)

1 个答案:

答案 0 :(得分:1)

这正是消息所说的内容:

  

TypeError:必须使用Background调用未绑定的方法update()   实例作为第一个参数(没有取而代之)

这意味着您正在调用类而不是实例(对象)。在python模块中大写,并且按照惯例,实例不应该。

非大写的行应如下所示:

background.update(screen)
ship.update(screen)