不知道为什么会报错啊。
main.py
import sys import pygame import constants from game.plane import OurPlane, SmallEnemyPlane def main(): ''' 游戏入口,main方法 ''' # 初始化 pygame.init() width, height = 480, 852 # 屏幕对象 screen = pygame.display.set_mode((width, height)) # 设置窗口标题 pygame.display.set_caption('飞机大战') # 加载背景图片 bg = pygame.image.load(constants.BG_IMG) # 游戏的标题 img_game_title = pygame.image.load(constants.IMG_GAME_TITLE) img_game_title_rect = img_game_title.get_rect() # 宽度和高度 t_width, t_height = img_game_title.get_size() img_game_title_rect.topleft = (int((width - t_width) / 2), int(height / 2 - t_height)) # 开始按钮 btn_start = pygame.image.load(constants.IMG_GAME_START_BTN) btn_start_rect = btn_start.get_rect() btn_width, btn_height = btn_start.get_size() btn_start_rect.topleft = (int((width - btn_width) / 2), int(height / 2 + btn_height)) # 加载背景音乐 # pygame.mixer.music.load(constants.BG_MUSIC) # pygame.mixer.music.play(-1) # 无限循环播放 # pygame.mixer.music.set_volume(0.2) # 设置音量 # 游戏状态 status = 0 # 准备中,1 游戏中, 2 游戏结束 our_plane = OurPlane(screen, speed=20) frame = 0 # 播放帧数 clock = pygame.time.Clock() # 一架飞机可以属于多个精灵组 small_enemies = pygame.sprite.Group() enemies = pygame.sprite.Group() # 随机添加6架小型敌机 for i in range(6): plane = SmallEnemyPlane(screen, 8) plane.add(small_enemies, enemies) while True: # 设置帧速率 clock.tick(60) frame += 1 if frame >= 60: frame = 0 # 1. 监听事件 for event in pygame.event.get(): # 退出游戏 if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: # 鼠标点击进入游戏 # 游戏正在准备中,点击才能进入游戏 if status == 0: status = 1 elif event.type == pygame.KEYDOWN: # 键盘事件 # 正在游戏中,才需要控制键盘 WASD if status == 1: if event.key == pygame.K_w or event.key == pygame.K_UP: our_plane.move_up() elif event.key == pygame.K_s or event.key == pygame.K_DOWN: our_plane.move_down() elif event.key == pygame.K_a or event.key == pygame.K_LEFT: our_plane.move_left() elif event.key == pygame.K_d or event.key == pygame.K_RIGHT: our_plane.move_right() elif event.key == pygame.K_SPACE: # 发射子弹 our_plane.shoot() # 更新游戏的状态 if status == 0: # 游戏正在准备中 # 绘制背景 screen.blit(bg, bg.get_rect()) # 游戏标题 screen.blit(img_game_title, img_game_title_rect) # 开始按钮 screen.blit(btn_start, btn_start_rect) elif status == 1: # 游戏进行中 # 绘制背景 screen.blit(bg, bg.get_rect()) # 绘制飞机 our_plane.update(frame) # 绘制子弹 our_plane.bullets.update() # 绘制敌方飞机 small_enemies.update() pygame.display.flip() if __name__ == '__main__': main()
plane.py
''' 飞机的基类 我方的飞机 敌方的小型飞机 敌方的中型飞机 敌方的大型飞机 ''' import random import pygame import constants from game.bullet import Bullet class Plane(pygame.sprite.Sprite): ''' 飞机的基础类 ''' # 飞机的图片 plane_images = [] # 飞机爆炸的图片 destroy_images = [] # 坠毁的音乐地址 down_sound_src = None # 飞机的状态:True,活的, False,死的 active = True # 该飞机发射的子弹精灵组 bullets = pygame.sprite.Group() def __init__(self, screen, speed=None): super().__init__() self.screen = screen # 加载静态资源 self.img_list = [] self._destroy_img_list = [] self.down_sound = None self.load_src() # 飞行的速度 self.speed = speed or 10 # 获取飞机的位置 self.rect = self.img_list[0].get_rect() # 飞机的宽度和高度 self.plane_w, self.plane_h = self.img_list[0].get_size() # 游戏窗口的宽度和高度 self.width, self.height = self.screen.get_size() # 改变飞机的初始化位置,放在屏幕的下方 self.rect.left = int((self.width - self.plane_w) / 2) self.rect.top = int(self.height / 2) def load_src(self): '''加载静态资源''' # 飞机图像 for img in self.plane_images: self.img_list.append(pygame.image.load(img)) # 飞机坠毁的图像 for img in self.destroy_images: self._destroy_img_list.append(pygame.image.load(img)) # 坠毁的音乐 if self.down_sound_src: self.down_sound = pygame.mixer.Sound(self.down_sound_src) @property def image(self): return self.img_list[0] def blit_me(self): self.screen.blit(self.image, self.rect) def move_up(self): '''飞机向上移动''' self.rect.top -= self.speed def move_down(self): '''飞机向下移动''' self.rect.bottom += self.speed def move_left(self): '''飞机向左移动''' self.rect.left -= self.speed def move_right(self): '''飞机向右移动''' self.rect.right += self.speed def broken_down(self): '''飞机坠毁''' # 1. 播放坠毁音乐 if self.down_sound: self.down_sound.play() # 2. 播放坠毁的动画 for img in self._destroy_img_list: self.screen.blit(img, self.rect) # 3. 坠毁后。。。 self.active = False def shoot(self): '''飞机发射子弹''' bullet = Bullet(self.screen, self, 15) self.bullets.add(bullet) class OurPlane(Plane): ''' 我方的飞机 ''' # 飞机的图片 plane_images = constants.OUR_PLANE_IMG_LIST # 飞机爆炸的图片 destroy_images = constants.OUR_DESTROY_IMG_LIST # 坠毁的音乐地址 down_sound_src = None def update(self, frame): '''更新飞机的动画效果''' if frame % 5: self.screen.blit(self.img_list[0], self.rect) else: self.screen.blit(self.img_list[1], self.rect) def move_up(self): '''向上移动,超出范围之后,拉回来''' super().move_up() if self.rect.top <= 0: self.rect.top = 0 def move_down(self): '''向下移动,超出范围之后,拉回来''' super().move_down() if self.rect.top >= self.height - self.plane_h: self.rect.top = self.height - self.plane_h def move_left(self): '''向左移动,超出范围之后,拉回来''' super().move_left() if self.rect.left <= 0: self.rect.left = 0 def move_right(self): '''向右移动,超出范围之后,拉回来''' super().move_right() if self.rect.left >= self.width - self.plane_w: self.rect.left = self.width - self.plane_w class SmallEnemyPlane(Plane): '''地方的小型飞机类''' # 飞机的图片 plane_images = constants.SMALL_ENEMY_PLANE_IMG_LIST # 飞机爆炸的图片 destroy_images = constants.SMALL_ENEMY_DESTROY_IMG_LIST # 坠毁的音乐地址 down_sound_src = constants.SMALL_ENEMY_PLANE_DOWN_SOUND def __init__(self, screen, speed): super().__init__(screen, speed) # 每次生成一架新的小型飞机的时候,随机出现在屏幕中 # 改变飞机的随机位置 self.init_pos() def init_pos(self): '''改变飞机的随机位置''' # 屏幕的宽度 - 飞机的宽度 self.rect.left = random.randint(0, self.width - self.plane_w) # 屏幕之外随机高度 self.rect.top = random.randint(-5 * self.plane_h, -self.plane_h) def update(self, *args): '''更新飞机的移动''' super().move_down() # 画在屏幕上 self.blit_me() # 超出范围如何处理 # 1.重用 if self.rect.top >= self.height: self.active = False # self.kill() self.reset() # todo 2.多线程、多进程 def reset(self): '''重置飞机的状态,达到复用的效果''' self.active = True # 改变飞机的随机位置 self.init_pos()
14
收起
正在回答 回答被采纳积分+1
1回答
1.Python零基础入门
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星