首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写游戏教程代码时的TypeError

重写游戏教程代码时的TypeError
EN

Stack Overflow用户
提问于 2022-05-26 14:53:06
回答 1查看 31关注 0票数 0

YT教程中的代码,我正在使用它作为游戏的基础,附加的元素不包括在教程中:

代码语言:javascript
复制
# Import
import os
import time
import pygame
import random

# Get font for text
pygame.font.init()

# Set directory
os.chdir(r'E:\Data\python_data\game\Space Invaders')

WIDTH, HEIGHT = 850, 850
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Invasion from Space")


# LOADING IMAGES

# Enemy ships
RED_SHIP = pygame.image.load(os.path.join('assets', 'pixel_ship_red_small.png'))
GREEN_SHIP = pygame.image.load(os.path.join('assets', 'pixel_ship_green_small.png'))
BLUE_SHIP = pygame.image.load(os.path.join('assets', 'pixel_ship_blue_small.png'))

# Player ship
YELLOW_SHIP = pygame.image.load(os.path.join('assets', 'pixel_ship_yellow.png'))

# Background image 
SPACE = pygame.transform.scale(pygame.image.load(os.path.join('assets', 'background-black.png')), 
                               ((WIDTH, HEIGHT)))

# Lasers
RED_LASER = pygame.image.load(os.path.join('assets', 'pixel_laser_red.png'))
GREEN_LASER = pygame.image.load(os.path.join('assets', 'pixel_laser_green.png'))
BLUE_LASER = pygame.image.load(os.path.join('assets', 'pixel_laser_blue.png'))
YELLOW_LASER = pygame.image.load(os.path.join('assets', 'pixel_laser_yellow.png'))



# Setting ship class

class Ship:
    def __init__(self, x, y, health=100):
        
        self.x = x
        self.y = y
        self.health = health
        self.ship_img = None
        self.laser_img = None
        self.lasers = []
        self.cool_down_counter = 0
        
    def draw(self, window):
        #pygame.draw.rect(window, (255, 0, 0), (self.x, self.y, 50, 50))
        window.blit(self.ship_img, (self.x, self.y))
        
class Player(Ship):
    def __init__(self, x, y, health=100):
        super().__init__(x, y, health)
        self.ship_img = YELLOW_SHIP
        self.laser_img = YELLOW_LASER
        
        self.mask = pygame.mask.from_surface(self.ship_img)
        self.max_health = health
        
# Define function
    # check other FPS values (30, 60, 120)

def main():
    run = True
    FPS = 60
    level = 1
    lives = 3
    main_font = pygame.font.Font("PokemonGb-RAeo.ttf", 12)
    
    player_vel = 7.5
    ship = Ship(425, 700)
    
    clock = pygame.time.Clock()
    
    def redraw_window():
        WIN.blit(SPACE, (0, 0))
        
        # draw text
        levels_label = main_font.render(f"Level: {level}", 1, (255, 255, 255))
        lives_label = main_font.render(f"Lives: {lives}", 1, (255, 255, 255))
        
        WIN.blit(lives_label, (10, 10))
        WIN.blit(levels_label, (WIDTH - levels_label.get_width() - 10, 10))
        
        ship.draw(WIN)
        
        pygame.display.update()
    
    while run:
        clock.tick(FPS)
        redraw_window()
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
        
        # Define keys        
        keys = pygame.key.get_pressed()
        if keys[pygame.K_a] and ship.x - player_vel > 0: # turn left
            ship.x -= player_vel
            
        if keys[pygame.K_d] and ship.x + player_vel + 50 < WIDTH: # turn right
            ship.x += player_vel
            
        if keys[pygame.K_w] and ship.y - player_vel > 0: # turn up
            ship.y -= player_vel
            
        if keys[pygame.K_s] and ship.y + player_vel + 45 < HEIGHT: # turn down
            ship.y += player_vel

main()

我遇到的问题是TypeError:

代码语言:javascript
复制
File "E:\Data\python_data\game\Space Invaders\main.py", line 65, in draw
window.blit(self.ship_img, (self.x, self.y))

TypeError: argument 1 must be pygame.Surface, not None

我很困惑为什么TypeError会发生,因为我做的和视频中的人一样。

链接到YT教程视频:https://www.youtube.com/watch?v=Q-__8Xw9KTM&t=159s

EN

回答 1

Stack Overflow用户

发布于 2022-05-27 19:40:11

Ship类的__init__函数中,self.ship_img设置为None。这可能是为了以后把它设置成一个真实的图像,但这从来没有发生过。

在本教程中,这是在PlayerEnemy子类中完成的。由于您正在直接使用` `Ship类,您必须自己设置它。

由于有三个船舶映像和random模块是无用的导入,我认为意图是随机选择船舶的形象。这可以通过在创建ship之后添加以下代码行来完成:

代码语言:javascript
复制
ship.ship_img = random.choice([RED_SHIP, GREEN_SHIP, BLUE_SHIP])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72393796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档