YT教程中的代码,我正在使用它作为游戏的基础,附加的元素不包括在教程中:
# 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:
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
发布于 2022-05-27 19:40:11
在Ship类的__init__函数中,self.ship_img设置为None。这可能是为了以后把它设置成一个真实的图像,但这从来没有发生过。
在本教程中,这是在Player和Enemy子类中完成的。由于您正在直接使用` `Ship类,您必须自己设置它。
由于有三个船舶映像和random模块是无用的导入,我认为意图是随机选择船舶的形象。这可以通过在创建ship之后添加以下代码行来完成:
ship.ship_img = random.choice([RED_SHIP, GREEN_SHIP, BLUE_SHIP])https://stackoverflow.com/questions/72393796
复制相似问题