我收到一个错误,参数 1 必须是 pygame.Surface,而不是 None。我该如何解决

I am getting an error with argument 1 must be pygame.Surface, not None. How do I fix this

我正在关注 YouTube 上的代码教程,但由于某些原因,我的代码无法执行,因为它会生成此错误代码。请帮忙,谢谢。

回溯(最后一次调用): 文件“H:\Year 12 ict\game project\space game booster WORKING.py”,第 194 行,在 主要的() 主文件“H:\Year 12 ict\game project\space game booster WORKING.py”,第 192 行 redraw_window() 文件“H:\Year 12 ict\game project\space game booster WORKING.py”,第 144 行,在 redraw_window enemy.draw(WINDOW) 文件“H:\Year 12 ict\game project\space game booster WORKING.py”,第 81 行,在抽奖中 window.blit(self.player_img, (self.x, self.y)) 类型错误:参数 1 必须是 pygame.Surface,而不是 None

密码是:

import pygame
import os
import random
import time
pygame.font.init()

pygame.init()

pygame.mixer.music.load(os.path.join("assets", 
"BackgroundMusic.mp3"))

#游戏window

WIDTH, HEIGHT = 500,500
WINDOW = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shootergame")

#Player player
PLAYER_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_player.png"))

#Enemy players
EMS_1 = pygame.image.load(os.path.join("assets", "space_enemy_1R.png"))
EMS_2 = pygame.image.load(os.path.join("assets", "space_enemy_2R.png"))
EMS_3 = pygame.image.load(os.path.join("assets", "space_enemy_3R.png"))
EMS_4 = pygame.image.load(os.path.join("assets", "space_enemy_4R.png"))

#Asteroids
ASTEROID_1 = pygame.image.load(os.path.join("assets", "asteroid_1R.png"))
ASTEROID_2 = pygame.image.load(os.path.join("assets", "asteroid_2R.png"))
ASTEROID_3 = pygame.image.load(os.path.join("assets", "asteroid_3R.png"))

#Boss 
BOSS = pygame.image.load(os.path.join("assets", "bossR.png"))

#Lasers
RED_LZ = pygame.image.load(os.path.join("assets", "red_laserR.png"))
GREEN_LZ = pygame.image.load(os.path.join("assets", "green_laserR.png"))
BLUE_LZ = pygame.image.load(os.path.join("assets", "blue_laserR.png"))
PURPLE_LZ = pygame.image.load(os.path.join("assets", "purple_laserR.png"))

BACKGROUND = pygame.transform.scale(pygame.image.load(os.path.join("assets", "bg.png")), (WIDTH,HEIGHT))
boost = False
boost_speed = 8

def score_write():
        d = shelve.open('score.txt','w')
        d['score'] = score
        d.close()

def score_read():
        d = shelve.open('score.txt')
        score = d['score']
        d.close()

def score_multiply():
        if time <= 50:
            score = score*10
        if time <= 100 and time > 50:
            score = score*5
        if time <= 150 and time > 100:
            score = score*3
        if time <= 200 and time > 150:
            score = score*2
        if time > 200:
            score = score



class ship:
    def __init__(self, x,y, health=100):
        self.x = 220
        self.y = 450
        self.health = health
        self.player_img = None
        self.laser_img = None
        self.lasers = []
        self.cool_down = 0

    def draw(self, window):
        window.blit(self.player_img, (self.x, self.y))

    def get_width(self):
        return self.player_img.get_width()

    def get_height(self):
        return self.player_img.get_height()

class Player(ship):
    def __init__(self, x, y, health=100):
        super().__init__(x,y, health)
        self.player_img = PLAYER_SPACE_SHIP
        self.laser_img = RED_LZ
        self.mask =     pygame.mask.from_surface(self.player_img)
        self.max_health = health

class Em(ship):
    COLOUR_MAP = {
                 "red": (EMS_1, RED_LZ),
                 "green": (EMS_2, GREEN_LZ),
                 "purple": (EMS_3, PURPLE_LZ),
                 "blue": (EMS_4, BLUE_LZ)
                 }
    def __init__(self, x, y, colour, health=100):
        super().__init__(x, y, health)
        self.ship_img, self.laser_img =     self.COLOUR_MAP[colour]
        self.mask = pygame.mask.from_surface(self.ship_img)

    def move(self,vel):
        self.y += vel
    

def main():

run = True
FPS = 60
level = 1
hp = 2
boostspeed = 4
player_vel = 3
boost = player_vel + 5
main_font = pygame.font.SysFont("comicsans", 40)
clock = pygame.time.Clock()
pygame.mixer.music.play(loops=-1)

enemies = []
wave_length = 5
enemy_vel = 1

boost = 10

player = Player(300,650)

def redraw_window():
    WINDOW.blit(BACKGROUND, (0,0))

    hp_label = main_font.render(f"HP: {hp}", 1, (255,255,255))
    level_label = main_font.render(f"Level: {level} ", 1, (255,255,255))

    WINDOW.blit(hp_label, (10, 10))
    WINDOW.blit(level_label, (WIDTH - level_label.get_width() - 10,10))

    for enemy in enemies:
            enemy.draw(WINDOW)

    player.draw(WINDOW)

    
    pygame.display.update()
    
    
while run:
    clock.tick(FPS)

    if len(enemies) == 0:
            level += 1
            wave_length += 5
            for i in range(wave_length):
                    enemy = Em(random.randrange(50, WIDTH-10), random.randrange(-1500*level/5, -100), random.choice(["red","green","purple","blue"]))
                    enemies.append(enemy)
    boost = False
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    keys = pygame.key.get_pressed()
   
    if keys[pygame.K_LEFT] and player.x - player_vel > 0:
        player.x -= player_vel
    if keys[pygame.K_RIGHT] and player.x + player_vel + player.get_width() < WIDTH:
        player.x += player_vel
    if keys[pygame.K_UP] and player.y - player_vel > 0:
        player.y -= player_vel
    if keys[pygame.K_DOWN] and player.y + player_vel + player.get_height() < HEIGHT:
        player.y += player_vel

    if keys[pygame.K_LSHIFT]:
        boost = True
        start = time.time()
        if boost == True:
            player_vel = boost_speed
            
            


    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_LSHIFT:
            player_vel = 3

    for enemy in enemies:
            enemy.move(enemy_vel)
    
    redraw_window()        

main()
score_write()

尝试在飞船 class 中将 self.player_img = None 更改为 self.player_img = pygame.Surface((0, 0))。此外,当您加载图像时,请在末尾使用 .convert.convert_alpha(),例如 img = pygame.image.load("image.png").convert_alpha()。它应该会提高性能。

你也可以在 blitting 之前把这个放在 draw():

if not self.player_img:
    return