Pygame开发太空侵略者游戏:窗口弹出后立即关闭问题求助
解决太空侵略者游戏窗口弹出即关闭的问题
以下是导致问题的核心错误及修复方案:
语法错误触发程序终止:
Ship类的draw方法最后多了一个多余的x,这会直接引发语法错误,导致程序运行到此处立刻终止,窗口随之关闭。
修复:删除pygame.draw.rect(window, (255,0,0), (self.x, self.y, 50, 50))末尾的x。事件处理逻辑位置错误:处理窗口关闭事件的循环写在了主游戏循环
while run的外面,导致游戏循环内无法响应退出操作;若修复语法错误后,游戏会进入死循环,无法正常关闭。
修复:将事件处理代码移到while run循环内部。画面刷新机制缺失:
redraw_window函数内没有调用pygame.display.update(),绘制的内容无法显示到窗口;原代码中仅在函数外执行了一次刷新,无法实时更新画面。
修复:在redraw_window函数末尾添加pygame.display.update(),并删除函数外的刷新语句。额外优化:原代码中玩家飞船图片覆盖了
RED_SPACE_SHIP变量,建议重命名为PLAYER_SHIP,避免后续使用红色敌人飞船时出错。
修复后的完整代码
import pygame import os import time import random pygame.font.init() WIDTH, HEIGHT = 750, 750 WIN = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Space Invaders") # Load Enemy Ships RED_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_red_small.png")) GREEN_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_green_small.png")) BLUE_SPACE_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_blue_small.png")) # Player Ship PLAYER_SHIP = pygame.image.load(os.path.join("assets", "pixel_ship_yellow.png")) # 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")) # Background BG = pygame.transform.scale(pygame.image.load(os.path.join("assets", "background-black.png")), (WIDTH, HEIGHT)) 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)) def main(): run = True FPS = 60 level = 1 lives = 5 main_font = pygame.font.SysFont("comicsans", 50) ship = Ship(300, 650) clock = pygame.time.Clock() def redraw_window(): WIN.blit(BG, (0,0)) # Draw text lives_label = main_font.render(f"Lives: {lives}", 1, (255,255,255)) level_label = main_font.render(f"Level: {level}", 1, (255,255,255)) WIN.blit(lives_label, (10, 10)) WIN.blit(level_label,(WIDTH - level_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 pygame.quit() main()
内容的提问来源于stack exchange,提问作者user18851688
相关产品推荐
相关产品推荐

