
飞船不能用键盘控制,即使是执行随时附赠的代码也是一样
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.scren.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() 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 方法将飞船图像绘制到游戏窗口上 1 cnsdytedison 2023-06-09 07:28:46 +08:00 via Android 你上下左右接打印调试一下呗。 |
2 dlsflh 2023-06-09 09:27:51 +08:00 via Android 这是新手吗?我是新新手。 |
3 Serialize 2023-06-09 10:09:15 +08:00 我也在看看这本书,我直接看那个分析数据的部分了,跳过了做游戏的 |
4 yushenglin 2023-06-09 10:12:05 +08:00 断点看看,按下按键视图有没有刷新了 |
5 zhaoxiaofeng OP @Serialize 这个项目是不是没有必要跟,实际上 pygame 基本上没有人使用吗? |
6 wliansheng 2023-06-09 11:17:20 +08:00 @zhaoxiaofeng py 在实际生产中,很少做游戏。用来学习 py 可以。一般是后台,数据,网络,方面。 |
7 bloomcannon166 2023-06-09 12:12:05 +08:00 ship 类的 update 方法没加上 |
8 Alias4ck 2023-06-09 12:26:25 +08:00 |
9 lightcreater 2023-06-09 14:33:56 +08:00 我在 B 站黑马课程上也学过用 PYGAME 做飞机大战 按键监听是这样写的,可以正常运行 def __jianting(self): key_pressed = pygame.key.get_pressed() if key_pressed[pygame.K_RIGHT]: self.hero_group.update(-2) elif key_pressed[pygame.K_LEFT]: self.hero_group.update(2) for event in pygame.event.get(): if event.type == pygame.QUIT: self.__gameover() elif event.type == sprite_model.ENEMY_TIMER: enemy1 = sprite_model.enemy() self.enemy_group.add(enemy1) elif event.type == sprite_model.BULL_TIMER: self.hero.fire() # elif event.type == pygame.KEYDOWN and event.KEY == pygame.K_RIGHT: # pass |
10 Serialize 2023-06-09 15:06:59 +08:00 @wliansheng 我的目标是学一下爬虫啥的,所以对游戏那部分不是特别敢兴趣,这个主要是看你自己的目标是啥 |
11 BaldPhoenix 2023-06-09 17:59:05 +08:00 代码看起来基本正确,但是在代码中缺少了`Settings`类的定义。这个类是用于管理游戏的设置和属性的。你需要添加`Settings`类的定义,并确保在`AlienInvasion`类的`__init__`方法中实例化一个`Settings`对象并将其赋值给`self.settings`属性。 以下是一个简单的`Settings`类的示例,你可以根据自己的需求进行调整: ```python class Settings: """存储《外星人入侵》的所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230) ``` 将上述`Settings`类的定义添加到你的代码中,并在`AlienInvasion`类的`__init__`方法中添加以下代码来实例化一个`Settings`对象: ```python self.settings = Settings() ``` 这样就能够正常运行游戏,并使用自定义的设置。 |
12 zhaoxiaofeng OP 破案了经过逐行比对,是 run_game 里面少调用了飞船的 update 方法 ,再次谢谢大家 def run_game(self): """开始游戏的主循环""" while True: self._check_events() self.ship.update()#缺的内容 self._update_screen() # 每秒钟最多更新 60 次画面 self.clock.tick(60) |