class Game(object): def __init__(self): pygame.init() # 初始化pygame库 self.score = 0 self.window = pygame.display.set_mode([WIN_X, WIN_Y]) # 绘制游戏窗口(为了以后修改将窗口数据用常量) pygame.display.set_caption("飞机大战") # 设置窗口标题 # 设计游戏图标步骤1 加载图片(凡是涉及到添加图形,音乐的都要先把内容加载都内存) 2 调用set_icon() img = pygame.image.load("res/app.ico") # 因为这个img只在__init__函数里面使用故不加self pygame.display.set_icon(img) self.map = Map(self.window) self.hero = Hero(self.window) self.enemys_list = [Enemy(self.window) for _ in range(4)] pygame.mixer.music.load("res/bg2.ogg") # 加载背景音乐 pygame.mixer.music.play(-1) # 循环播放背景音乐 self.f = pygame.font.SysFont("宋体", 36) def inputOrder(self): # 获得所有事件的列表 event_list = pygame.event.get() for event in event_list: # 1. 鼠标点击关闭窗口事件 if event.type == pygame.QUIT: print("关闭了窗口") sys.exit() # 2. 键盘按下事件 if event.type == pygame.KEYDOWN: # 现有键盘按下时间才能对按下那个键进行判断,这个容易忘 # 判断用户按下的键是否是空格键 if event.key == pygame.K_SPACE: self.hero.shot() def is_bullet_hit_enemy(self): for i in self.enemys_list: for j in self.hero.bullets_list: if pygame.Rect.colliderect(i.rect, j.rect): self.score += 1 i.reserve() def is_hero_hit_enemy(self): for i in self.enemys_list: if pygame.Rect.colliderect(i.rect, self.hero.rect): return True else: return False def move(self): self.map.move() self.hero.move() for i in self.enemys_list: i.move() self.is_bullet_hit_enemy() def blited(self): self.text_surface = self.f.render("SCORE: %s" % self.score, True, (0, 0, 255)) self.map.blited() self.hero.blited() self.window.blit(self.text_surface, (340, 10)) for i in self.enemys_list: i.blited() @staticmethod # 因为图片更新方法不需要任何参数所以设置成静态方法 def update(): pygame.display.update() def run(self): # 游戏运行时主要有下面四件事 self.inputOrder() #1 接受外界输入指令 self.move() #2 接受命令后导致图片移动 if self.is_hero_hit_enemy(): # 如果飞机被撞结束游戏 self.is_over() self.blited() #3 图片重新绘制 self.update() #4 图片更新 def is_over(self): pygame.mixer.music.stop() # 停止背景音乐 boom_sound = pygame.mixer.Sound("res/gameover.wav") # 加载音效 boom_sound.play() # 播放音效 while True: event_list = pygame.event.get() for event in event_list: # 1. 鼠标点击关闭窗口事件 if event.type == pygame.QUIT: print("关闭了窗口") sys.exit() def main(self): while True: self.run()
class PlaneWar(object): def __init__(self): pygame.init() # 创建游戏窗口对象 self.window = pygame.display.set_mode([WINDOW_WIDTH, WINDOW_HEIGHT]) self.set_window() self.map = Map(self.window) self.hero = Hero(self.window) self.enemy = [Enemy(self.window) for _ in range(4)] self.score = 0 @staticmethod def set_window(): # 设置窗口标题 pygame.display.set_caption("飞机大战2018正常版") # 设置窗口小图标--icon icon = pygame.image.load("res/app.ico") pygame.display.set_icon(icon) # 加载背景音乐 pygame.mixer.music.load("./res/bg2.ogg") # 循环播放背景音乐 pygame.mixer.music.play(-1) def events(self): """执行窗口事件""" # 窗口事件 event_list = pygame.event.get() for event in event_list: # 1. 鼠标点击关闭窗口事件 if event.type == pygame.QUIT: print("关闭了窗 口") sys.exit() # 2. 键盘按下事件 if event.type == pygame.KEYDOWN: # 判断用户按下的键是否是空格键 if event.key == pygame.K_SPACE: print("按了空格 ") self.hero.shot() # 飞机发射子弹 def move(self): """处理各个对象(飞机、子弹、敌机、地图)的移动""" self.map.move() self.hero.move() for i in self.hero.bullets: # i就是每一个子弹 i.move() for i in self.enemy: # i是每一只敌机 i.move() def blit(self): """绘制窗口中需要 显示 的所有的对象""" self.map.blited() self.hero.blited() for i in self.enemy: # i是每一只敌机 i.blited() def update(self): """更新界面""" pygame.display.update() def is_bullet_hit_enemy(self): # 判断两个矩形是否相交,相交返回True,否则返回False # flag = pygame.Rect.colliderect(rect1, rect2) # if flag: for i in self.enemy: for j in self.hero.bullets: if pygame.Rect.colliderect(i.rect, j.rect): i.reset() self.score += 20 # self.hero.bullets.remove(j) def is_hero_hit_enemy(self): for i in self.enemy: if pygame.Rect.colliderect(i.rect, self.hero.rect): return True # 如果相交了就返回真 else: return False def write(self, text, y, font_size): font = pygame.font.SysFont('SimHei', font_size) # render(text(文本内容), antialias(抗锯齿), color(RGB)),返回文字对象 textobj = font.render(text, 1, (200, 200, 200)) # 设置文字矩形对象位置 textrect = textobj.get_rect() textrect.move_ip(WINDOW_WIDTH / 2 - textrect[2] / 2, y) # 在指定位置绘制指定文字对象 self.window.blit(textobj, textrect) # 更新界面 pygame.display.update() def wait_player_input(self): while True: # 窗口事件 event_list = pygame.event.get() for event in event_list: # 1. 鼠标点击关闭窗口事件 if event.type == pygame.QUIT: print("关闭了窗 口") sys.exit() # 2. 键盘按下事件 if event.type == pygame.KEYDOWN: # 判断用户按下的键是否是a键 if event.key == pygame.K_RETURN: print("按了回车") return def gameover(self): # 停止背景音乐 pygame.mixer.music.stop() # 加载音效 boom_sound = pygame.mixer.Sound("./res/gameover.wav") # 播放音效 boom_sound.play() self.write("游戏结束", 150, 50) self.write("按Enter关闭窗口", 230, 40) self.wait_player_input() def gamebegin(self): """游戏开始界面""" self.map.blited() self.write("游戏开始", 150, 50) self.write("按Enter开始游戏", 230, 40) self.wait_player_input() def run(self): self.gamebegin() while True: # 1、事件 self.events() # 2、各个对象(飞机、子弹、敌机、地图)的移动 self.move() # 判断子弹是否打中敌机 self.is_bullet_hit_enemy() # 判断飞机是否撞击到敌机 if self.is_hero_hit_enemy(): break # 3、往窗口中绘制图片 self.blit() self.write("得分:%s" % self.score, 0, 30) # 4、更新界面 self.update() # gameover界面 self.gameover()
class PlaneWar(object): def __init__(self): # 定义初始值;define the initial value # 初始化pygame # Initialization of pygame pygame.init() # 创建窗口;set window sizes window = pygame.display.set_mode( [setting.WIN_WIDTH, setting.WIN_HEIGHT]) # 调用设置窗口;run setting window properties self.set_window() # 创建对象;create objects self.map = Map(window) self.hero = Hero(window) self.enemy = [Enemy(window) for _ in range(4)] @staticmethod def set_window(): # 设置窗口标题;set window caption pygame.display.set_caption("AirWar1.0") # 加载窗口图标;load window's image icon = pygame.image.load("res/game.ico") # 设置窗口图标;set window's image pygame.display.set_icon(icon) # 定义事件方法;define events method def events(self): # 获取响应事件;get the events in response event_list = pygame.event.get() # 遍历事件;traversal events for event in event_list: # 鼠标点击关闭窗口事件(解决未响应);exit event if event.type == pygame.QUIT: print("关闭了窗口") sys.exit() # 判断是否空格;if press space,shoot if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: self.hero.shooting() # 定义移动方法;define a movement method def move(self): self.map.move() self.hero.move() # 每一个子弹都需要调用自己的move方法;each bullet needs to call its own move method for i in self.hero.bullets: i.move() # 移动每一个敌机;move each enemy for i in self.enemy: i.move() def hit_enemy(self): # 判断两个矩形是否相交,相交返回True,否则返回False;to determine whether two rectangles intersect, the intersection returns True or False for i in self.hero.bullets: for j in self.enemy: if pygame.Rect.colliderect(i.bullet_rect, j.enemy_rect): j.enemy_reset() def crash(self): # 判断两个矩形是否相交,相交返回True,否则返回False;to determine whether two rectangles intersect, the intersection returns True or False for i in self.enemy: if pygame.Rect.colliderect(i.enemy_rect, self.hero.hero_rect): return True else: return False # 定义绘制方法;define the drawing method def blit(self): self.map.blited() self.hero.blited() # 遍历绘制敌机;iterating over to draw the enemys for i in self.enemy: i.blited() # 定义显示方法;define display method def display(self): pygame.display.update() def gameover(self): while True: # 获取响应事件;get the events in response event_list = pygame.event.get() # 遍历事件;traversal events for event in event_list: # 鼠标点击关闭窗口事件(解决未响应);exit event if event.type == pygame.QUIT: print("关闭了窗口") sys.exit() # 定义运行方法;define the operation method def run(self): while True: # 1.调用事件方法;run events method self.events() # 2.各个对象的移动;run a movement method self.move() # 3.判断是否打中敌机;judge whether you hit the enemys self.hit_enemy() if self.crash(): break # 4.绘制图片对象;run a bullet method self.blit() # 5.更新界面;update display content self.display() self.gameover()