新手学习《 Python 编程:从入门到实践》遇到了个问题

查看 30|回复 0
作者:zhaoxiaofeng   
在跟练《外星人入侵》这个项目时遇到了个问题,希望大佬可以帮忙看下
飞船不能用键盘控制,即使是执行随时附赠的代码也是一样
下面是代码
alien_invasion.py
import sys  # 导入 sys 模块,用于退出程序
import pygame  # 导入 pygame 模块,用于创建游戏窗口和处理事件
from settings import Settings
from ship import Ship
class AlienInvasion:  # 定义一个类,表示外星人入侵的游戏
    """一个管理游戏资源和行为的类"""
    def __init__(self) -> None:  # 定义初始化方法,设置游戏的属性
        """初始化游戏并创建游戏资源"""
        pygame.init()  # 初始化 pygame ,准备显示模式和其他设置
        self.settings = Settings()
        self.clock = pygame.time.Clock()  # 创建一个时钟对象,用于控制游戏的帧率
        self.screen = pygame.display.set_mode(
            (self.settings.screen_height, self.settings.screen_width)
        )  # 创建一个屏幕对象,设置分辨率为 3842x2160
        pygame.display.set_caption("Alien Invasion")  # 设置屏幕的标题为“Alien Invasion”
        # 设置背景色
        # self.bg_color = (230, 230, 230)
        self.ship = Ship(self)
    def run_game(self):
        """开始游戏的主循环"""
        while True:
            self._check_events()
            self._update_screen()
            # 每秒钟最多更新 60 次画面
            self.clock.tick(60)
    def _check_events(self):
        for event in pygame.event.get():
            # 如果用户单击了关闭按钮,退出程序
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = True
                elif event.key == pygame.K_LEFT:
                    self.ship.moving_left = True
                    # self.ship.rect.x += 1
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = False
                elif event.key == pygame.K_LEFT:
                    self.ship.moving_left = False
    def _update_screen(self):
        # 每次循环都重绘屏幕
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        # 更新屏幕上的图像,并切换到新屏幕
        pygame.display.flip()
if __name__ == "__main__":
    # 创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()
if __name__ == "__main__":
    # 创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run_game()
ship.py
import pygame  # 导入 pygame 模块,用于创建游戏窗口和处理图形
class Ship:
    """一个表示飞船的类"""
    def __init__(self, ai_game) -> None:
        """初始化飞船并设置其初始位置"""
        self.screen = ai_game.screen  # 获取游戏窗口对象
        self.screen_rect = ai_game.screen.get_rect()  # 获取游戏窗口的矩形属性
        self.image = pygame.image.load(
            "E:/alien_invasion/images/ship.bmp"
        )  # 加载飞船的图像文件
        self.rect = self.image.get_rect()  # 获取飞船图像的矩形属性
        self.rect.midbottom = self.screen_rect.midbottom  # 将飞船的中下方对齐到游戏窗口的中下方
        # 移动标志(飞船一开始不移动)
        self.moving_right = False
        self.moving_left = False
    def update(self):
        if self.moving_right:
            self.rect.x += 1
        if self.moving_left:
            self.rect.x -= 1
    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image, self.rect)  # 使用 pygame 的 blit 方法将飞船图像绘制到游戏窗口上
您需要登录后才可以回帖 登录 | 立即注册

返回顶部