Python项目实践1 您所在的位置:网站首页 外星飞船设计图 Python项目实践1

Python项目实践1

2023-10-16 11:51| 来源: 网络整理| 查看: 265

目标:使用Pygame开发一个《外星人入侵》的游戏。

GitHub地址:https://github.com/Angelia-Wang/alien_invasion

第十二章 武装飞船

首先要安装Pygame库:

pip install pygame

如果不行,就更新下pip:

conda update pip

建立一个名为alien_invasion的文件夹,我们之后的开发工作就在此文件夹中进行。

可以通过Git进行项目管理。

Git与GitHub使用指南

🌟 Pycharm使用Git以及GitHub的pull request流程

12.1 开始游戏项目

我们首先应创建一个Pygame窗口并能响应用户的输入。

12.1.1 涉及到的函数

导入的模块有Pygame、sys。

pygame.init() 初始化背景设置,让Pygame能正常工作。

pygame.display.set_mode((x,y)) 创建显示窗口。参数为元组,指定了游戏窗口的尺寸,单位为像素。返回值为surface,此处表示整个游戏窗口。

在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在此游戏中,每个元素(如外星人或飞船)都是一个surface。游戏每次重绘都会重绘所有surface。

pygame.display.set_caption(string) 设置游戏窗口标题。参数为字符串。

对surface调用 fill((255,255,255),[rect]) 用某种颜色填充调用的 surface 的 rect 区域。参数1为颜色,如红色为(255,0,0);绿色为(0,255,0);蓝色为(0,0,255);个数字相同则为灰色,数字的大小决定灰度。参数2 为rect对象,可不填,不填时表示用某种颜色填充调用的 surface。

pygame.display.flip() 命令 Pygame 让最近绘制的屏幕可见。

pygame.event.get() 得到一个监听键盘和鼠标事件列表(上一次被调用后发生的所有事件)。

事件 是用户玩游戏时执行的操作,如按键or移动鼠标等。

type() 事件的type方法能获取时间的类型。

pygame.QUIT 当玩家单击游戏窗口的关闭按钮时,会检测到此事件。

sys.exit() 退出游戏。

12.1.2 分析

了解了可以调用的函数后,我们在此步骤要做的就是:

创建游戏窗口(要设定基本的数据,如窗口颜色,窗口大小等)

关于游戏的设置信息,可以单独创建一个设置类

获取用户每时每刻的输入并作出响应

因为每时每刻的输入都要检测到,所以肯定要用循环,再循环中获取输入并作出响应

获取输入——监听事件

作出响应——对事件处理后更新屏幕

12.1.3 代码

setting.py

class Settings: """存储游戏《外星人入侵》中所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 # 屏幕宽度,单位像素 self.screen_height = 800 # 屏幕高度,单位像素 self.bg_color = (230, 230, 230) # 背景颜色

alien_invasion.py

import pygame import sys from settings import Settings class AlienInvastion: """初始化游戏资源和行为的类""" def __init__(self): """初始化游戏并创建游戏资源""" pygame.init() # 初始化Pygame背景设置 self.settings = Settings() self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) #创建显示窗口,返回值为surface对象 pygame.display.set_caption("外星人入侵") # 设置窗口标题 def run_game(self): """开始游戏的主循环""" while True: for event in pygame.event.get(): # 监听事件 if event.type == pygame.QUIT: sys.exit() # 退出游戏 self.screen.fill(self.settings.bg_color) # 设置surface背景颜色,此处surface为屏幕 pygame.display.flip() # 重绘屏幕 if __name__ == "__main__": ai = AlienInvastion() ai.run_game() 12.2 添加飞船图像

我们已经创建了Pygame的窗口且能响应用户的输入。现在我们需给用户一个操纵对象来进行游戏——飞船。

12.2.1 涉及到的函数

pygame.image.load(string) 加载飞船图像。参数为图片地址,返回图像的位置surface。

Pygame默认加载位图(.bmp),大多数图像为 .jpg、.png、.gif格式,可通过Photoshop等工具转换为位图。

get_rect() 获取相应 surface 的属性 rect。

Pygame之所以高效,是因为它能让你像处理矩形(rect对象)一样处理所有的游戏元素 surface,即使其形状并非矩形。

处理 rect 对象时,可通过设置矩形四角和中心的x坐标、y坐标来指定矩形的位置。

让游戏元素居中:设置相应 rect 对象的属性 center、centerx、centery 让游戏元素与屏幕边缘对齐:使用属性 top、bottom、left、right 或 midtop、midbottom、midleft、midright 要调整游戏元素的水平或垂直位置,可使用属性 x 和 y,分别是相应矩形左上角的 x 坐标和 y 坐标。

⚠️rect的x等属性只能存储整数值。

Pygame中,原点 (0, 0) 位于屏幕左上角,向右下移动坐标值变大。

blit(surface对象, rect对象) 将某surface (调用者)中的 surface 对象绘制到 rect 对象指定的位置。

self.screen.blit(self.image, self.rect) # 代码中的例子 12.2.2 分析

涉及到两步:

创建飞船对象(涉及到飞船图片、飞船在屏幕中的位置) 将飞船添加到屏幕中 12.2.3 代码

我们先在当前 alien_invasion 文件夹中新建 images 文件夹,并存放飞船图片 ship.bmp。

ship.py

import pygame class Ship: """管理飞船的类""" def __init__(self, ai_game): # 参数:引用self和指向当前AlienInvasion实例的引用,这让Ship能访问AlienInvasion中定义的所有游戏资源 """初始化飞船并设置其初始位置""" self.screen = ai_game.screen self.screen_rect = ai_game.screen.get_rect() # get_rect()访问屏幕的属性rect # 加载飞船图片并获取其外接矩形 self.image = pygame.image.load('images/ship.bmp') self.rect = self.image.get_rect() # 对每艘新飞船,都将其放在屏幕底部的中央 self.rect.midbottom = self.screen_rect.midbottom def blitme(self): """在指定位置绘制飞船""" self.screen.blit(self.image, self.rect)

alien_invasion.py

import sys import pygame from settings import Settings from ship import Ship class AlienInvasion: """初始化游戏资源和行为的类""" def __init__(self): """初始化游戏并创建游戏资源""" pygame.init() # 初始化背景设置,让 Pygame 能正常工作 self.settings = Settings() # 创建Settings实例并用它来访问设置 # 创建一个显示窗口。参数是元组,单位为像素,返回对象是surface(屏幕的一部分,用于显示游戏元素,这里表示整个游戏窗口) self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) self.ship = Ship(self) # !!!!!!! pygame.display.set_caption("Alien Invasion") def run_game(self): """开始游戏的主循环""" while True: # 通过辅助方法将事务管理与游戏的其他方面(如更新屏幕)分离——重构,使循环变得简单 """响应按键和鼠标事件""" for event in pygame.event.get(): # 得到一个监听键盘和鼠标事件列表(上一次被调用后发生的所有事件) if event.type == pygame.QUIT: # 玩家单击游戏窗口的关闭按钮时,将检测到 pygame.QUIT事件 sys.exit() # 退出游戏 # 每次循环时都重绘屏幕 """更新屏幕上的图像,并切换到新屏幕""" self.screen.fill(self.settings.bg_color) # 颜色,fill()方法用于处理surface,只接受一个实参——一种颜色 self.ship.blitme() # !!!!!!! 绘制飞船 pygame.display.flip() # 让最近绘制的屏幕可见 # 检查特殊变量 __name__,此变量为程序执行时设置。若此文件作为主程序执行,则此变量被设置为'__main__';若此文件被测试框架导入,则变量将不是'__main__' if __name__ == '__main__': # 创建游戏实例并运行游戏 ai = AlienInvasion() ai.run_game() 12.3 重构 run_game()方法

在大型项目中经常涉及到重构代码问题,重构目的在于简化既有代码的结构,使其更容易扩展。

重构某方法,可将其拆为多个 辅助方法。辅助方法在类中执行任务,不通过实例调用,以单个下划线打头。

12.3.1 分析

我们目前编写的代码中,可以预见在 run_game() 方法中,随着相应用户按键和鼠标的事件操作越来越细化,代码会越来越长。所以我们需对这个方法进行重构。

目前来看此方法中的 while 循环中的工作可分为两个部分:监听用户事件,重绘屏幕。因此我们可将 run_game() 方法划分为两个辅助方法:

_check_events() 进行事件管理 _update_screen() 更新屏幕 12.3.2 代码

alien_invasion.py

import sys import pygame from settings import Settings from ship import Ship class AlienInvasion: """初始化游戏资源和行为的类""" def __init__(self): """初始化游戏并创建游戏资源""" pygame.init() # 初始化背景设置,让 Pygame 能正常工作 self.settings = Settings() # 创建Settings实例并用它来访问设置 # 创建一个显示窗口。参数是元组,单位为像素,返回对象是surface(屏幕的一部分,用于显示游戏元素,这里表示整个游戏窗口) self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) self.ship = Ship(self) pygame.display.set_caption("Alien Invasion") def run_game(self): """开始游戏的主循环""" while True: # 通过辅助方法将事务管理与游戏的其他方面(如更新屏幕)分离——重构,使循环变得简单 self._check_events() # 每次循环时都重绘屏幕 self._update_screen() def _check_events(self): """响应按键和鼠标事件""" for event in pygame.event.get(): # 得到一个监听键盘和鼠标事件列表(上一次被调用后发生的所有事件) if event.type == pygame.QUIT: # 玩家单击游戏窗口的关闭按钮时,将检测到 pygame.QUIT事件 sys.exit() # 退出游戏 def _update_screen(self): """更新屏幕上的图像,并切换到新屏幕""" self.screen.fill(self.settings.bg_color) # 颜色,fill()方法用于处理surface,只接受一个实参——一种颜色 self.ship.blitme() # 绘制飞船 pygame.display.flip() # 让最近绘制的屏幕可见 # 检查特殊变量 __name__,此变量为程序执行时设置。若此文件作为主程序执行,则此变量被设置为'__main__';若此文件被测试框架导入,则变量将不是'__main__' if __name__ == '__main__': # 创建游戏实例并运行游戏 ai = AlienInvasion() ai.run_game() 12.4 驾驶飞船

我们现在已经有了飞船,接下来要做的就是让飞船能响应用户的操作(左右移动,但不能移出屏幕外)。

另外我们还希望:提高飞船的速度;按下q按键,退出游戏;将游戏全屏显示。

12.4.1 涉及到的函数

pygame.KEYDOWN 每次按键都会被注册为一个KEYDOWN事件。

pygame.FULLSCREE 参数,全屏参数。

pygame.display.set_mode((0, 0), pygame.FULLSCREE) 能生成一个覆盖整个显示器的屏幕

12.4.2 分析 按下左右按键控制飞船移动,则要监听键盘事件,监听到则更改飞船的rect对象的坐标 x 要使飞船能连续移动,则光监听按键 pygame.KEYDOWN 是不够的的,要记录键盘按下和松开之间的状态。所以我们在 Ship 类中定义两个属性 moving_right、moving_left,来判断是否应该左右移动。根据二者True还是False更新飞船位置。 更新位置前,要判断当前位置是否会超出屏幕,不会才更新位置。 因为要增加飞船移动的速度,则我们需要给飞船速度一个变量方便更改,若飞船移动的单位路程(速度)为小数,而rect对象的x等属性只能是整数,则为了准确性,我们应用float计算,最后赋值给rect对象。 按下q按键,退出游戏;将游戏全屏显示等功能都较简单,此处不赘述。 可以预见,_check_events() 方法由于响应按键的不同将会越来越复杂,所以我们对其进行解构,分为两个辅助方法: _check_keydown_events() 处理按键事件 _check_keyup_events() 处理松开按键事件 12.4.3 代码

ship.py

import pygame from settings import Settings class Ship: """管理飞船的类""" def __init__(self, ai_game): # 参数:引用self和指向当前AlienInvasion实例的引用,这让Ship能访问AlienInvasion中定义的所有游戏资源 """初始化飞船并设置其初始位置""" self.screen = ai_game.screen self.settings = ai_game.settings self.screen_rect = ai_game.screen.get_rect() # get_rect()访问屏幕的属性rect # 加载飞船图片并获取其外接矩形 self.image = pygame.image.load('images/ship.bmp') self.rect = self.image.get_rect() # 对每艘新飞船,都将其放在屏幕底部的中央 self.rect.midbottom = self.screen_rect.midbottom self.x = float(self.rect.x) # x属性存储小数值,因为rect的x等属性只能存储整数值 # 移动标志 self.moving_right = False self.moving_left = False def blitme(self): """在指定位置绘制飞船""" # print(self.rect.x,self.rect.y) self.screen.blit(self.image, self.rect) def update(self): if self.moving_right and self.rect.right < self.screen_rect.right: self.x += self.settings.ship_speed elif self.moving_left and self.rect.left > 0: self.x -= self.settings.ship_speed self.rect.x = self.x # 更新rect值

setting.py

class Settings: """存储游戏《外星人入侵》中所有设置的类""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 # 屏幕宽度,单位像素 self.screen_height = 800 # 屏幕高度,单位像素 self.bg_color = (230, 230, 230) # 背景颜色 # 飞船设置 self.ship_speed = 1.5

alien_invasion.py

import sys import pygame from settings import Settings from ship import Ship class AlienInvasion: """初始化游戏资源和行为的类""" def __init__(self): """初始化游戏并创建游戏资源""" pygame.init() # 初始化背景设置,让 Pygame 能正常工作 self.settings = Settings() # 创建Settings实例并用它来访问设置 # 创建一个显示窗口。参数是元组,单位为像素,返回对象是surface(屏幕的一部分,用于显示游戏元素,这里表示整个游戏窗口) self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # 全屏 self.settings.screen_width = self.screen.get_rect().width # 更新settings中配置 self.settings.screen_height = self.screen.get_rect().height self.ship = Ship(self) pygame.display.set_caption("Alien Invasion") def run_game(self): """开始游戏的主循环""" while True: # 通过辅助方法将事务管理与游戏的其他方面(如更新屏幕)分离——重构,使循环变得简单 self._check_events() self.ship.update() # 每次循环时都重绘屏幕 self._update_screen() def _check_events(self): """响应按键和鼠标事件""" for event in pygame.event.get(): # 得到一个监听键盘和鼠标事件列表(上一次被调用后发生的所有事件) if event.type == pygame.QUIT: # 玩家单击游戏窗口的关闭按钮时,将检测到 pygame.QUIT事件 sys.exit() # 退出游戏 elif event.type == pygame.KEYDOWN: # 玩家每次按键都被注册为一个KEYDOWN事件 self._check_keydown_events(event) elif event.type == pygame.KEYUP: self._check_keyup_events(event) def _check_keydown_events(self, event): """响应按键""" if event.key == pygame.K_RIGHT: self.ship.moving_right = True elif event.key == pygame.K_LEFT: self.ship.moving_left = True elif event.key == pygame.K_q: sys.exit() def _check_keyup_events(self, event): """响应松开""" 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) # 颜色,fill()方法用于处理surface,只接受一个实参——一种颜色 self.ship.blitme() # 绘制飞船 pygame.display.flip() # 让最近绘制的屏幕可见 # 检查特殊变量 __name__,此变量为程序执行时设置。若此文件作为主程序执行,则此变量被设置为'__main__';若此文件被测试框架导入,则变量将不是'__main__' if __name__ == '__main__': # 创建游戏实例并运行游戏 ai = AlienInvasion() ai.run_game() 12.5 射击

我们的用户目前已经能操控飞船左右移动了,接下来就可以设计飞船发射子弹的功能了。

12.5.1 涉及到的函数

pygame.Rect(x,y,width,height) 创建一个矩形,参数1~4分别表示矩形左上角的x坐标、y坐标以及矩形的宽度和高度。

pygame.draw.rect(surface, color, rect) 使用color的颜色填充rect对象占据的surface(可以是屏幕)部分。

# 二种写法效果相同,都会在屏幕的rect区域填充color self.screen.fill(self.button_color, self.rect) pygame.draw.rect(self.screen, self.button_color, self.rect)

pygame.sprite.Group() 创建 pygame.sprite.Group 类的一个实例。是一个编组(group),类似于列表,但提供了有助于开发游戏的额外功能。

对编组调用update() 方法时,编组会自动对其中的每个精灵(sprite)调用update()

我们可编写继承 Sprite 类的子类,重写update() 方法,这样就可以将游戏中相关元素编组,进而通过update同时操作编组中的所有元素。

引入Sprite 类:from pygame.sprite import Sprite

对编组调用 add(sprite) 方法,可将某精灵添加到编组中。此方法类似于append(),不过是专门为Pygame编组编写的。

对编组调用 remove(sprite) 方法,可删除编组中的某精灵。

对编组调用 sprites() 方法,返回一个列表,其中包含编组中的所有精灵。

12.5.2 分析

我们希望用户按下空格就能发射子弹,对能发射的子弹的最大数目要做出一定限制。

各个技术点如下:

创建子弹类——因为用户能发射多枚子弹,且子弹发出后要能不断射出(即子弹的位置每时每刻都要改变),所以我们可以考虑编写继承自 Sprite 类的子弹类 Bullet,这样通过实例化pygame.sprite.Group 类,我们就能得到一个子弹编组,可通过 add()、remove()方法添加、删除子弹。也能通过 update()方法统一对子弹的变化进行管理。 用户按下空格后,若当前子弹编组中子弹的数目 < 能发射子弹的最大数目,则add() 子弹抵达屏幕顶端后会消失,我们需要将这些无效的子弹自编组中删除,否则会持续消耗内存及CPU处理能力。这需遍历编组中的所有子弹,通过判断子弹的 rect.buttom 位置是否 self.stats.high_score: self.stats.high_score = self.stats.score self.prep_high_score()

ship.py

import pygame from pygame.sprite import Sprite class Ship(Sprite): """管理飞船的类""" def __init__(self, ai_game): # 参数:引用self和指向当前AlienInvasion实例的引用,这让Ship能访问AlienInvasion中定义的所有游戏资源 """初始化飞船并设置其初始位置""" super().__init__() self.screen = ai_game.screen self.settings = ai_game.settings self.screen_rect = ai_game.screen.get_rect() # get_rect()访问屏幕的属性rect # 加载飞船图片并获取其外接矩形 self.image = pygame.image.load('images/ship.bmp') self.rect = self.image.get_rect() # 对每艘新飞船,都将其放在屏幕底部的中央 self.rect.midbottom = self.screen_rect.midbottom self.x = float(self.rect.x) # x属性存储小数值,因为rect的x等属性只能存储整数值 # 移动标志 self.moving_right = False self.moving_left = False def blitme(self): """在指定位置绘制飞船""" self.screen.blit(self.image, self.rect) def update(self): if self.moving_right and self.rect.right < self.screen_rect.right: self.x += self.settings.ship_speed elif self.moving_left and self.rect.left > 0: self.x -= self.settings.ship_speed self.rect.x = self.x def center_ship(self): """让飞船在屏幕底部中央""" self.rect.midbottom = self.screen_rect.midbottom self.x = float(self.rect.x)

alien_invasion.py

import sys from time import sleep import pygame from settings import Settings from ship import Ship from bullet import Bullet from alien import Alien from game_stats import GameStats from button import Button from scoreboard import ScoreBoard class AlienInvasion: """初始化游戏资源和行为的类""" def __init__(self): """初始化游戏并创建游戏资源""" pygame.init() # 初始化背景设置,让 Pygame 能正常工作 self.settings = Settings() # 创建Settings实例并用它来访问设置 # 创建一个显示窗口。参数是元组,单位为像素,返回对象是surface(屏幕的一部分,用于显示游戏元素,这里表示整个游戏窗口) self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) self.stats = GameStats(self) # 创建存储游戏统计信息的实例 self.scoreboard = ScoreBoard(self) # 创建记分牌 self.ship = Ship(self) self.bullets = pygame.sprite.Group() # 创建用于存储子弹的编组 self.aliens = pygame.sprite.Group() # 创建用于存储外星人的编组 self.play_button = Button(self, "Play") # 创建 Play 按钮 self._create_fleet() pygame.display.set_caption("Alien Invasion") def run_game(self): """开始游戏的主循环""" while True: # 通过辅助方法将事务管理与游戏的其他方面(如更新屏幕)分离——重构,使循环变得简单 self._check_events() if self.stats.game_active: self.ship.update() self._update_bullets() self._update_aliens() # 每次循环时都重绘屏幕 self._update_screen() def _check_events(self): """响应按键和鼠标事件""" for event in pygame.event.get(): # 得到一个监听键盘和鼠标事件列表(上一次被调用后发生的所有事件) if event.type == pygame.QUIT: # 玩家单击游戏窗口的关闭按钮时,将检测到 pygame.QUIT事件 sys.exit() # 退出游戏 elif event.type == pygame.KEYDOWN: # 玩家每次按键都被注册为一个KEYDOWN事件 self._check_keydown_events(event) elif event.type == pygame.KEYUP: self._check_keyup_events(event) elif event.type == pygame.MOUSEBUTTONDOWN: # 玩家点击 Play 按钮 mouse_pos = pygame.mouse.get_pos() self._check_play_button(mouse_pos) def _check_keydown_events(self, event): """响应按键""" if event.key == pygame.K_RIGHT: self.ship.moving_right = True elif event.key == pygame.K_LEFT: self.ship.moving_left = True elif event.key == pygame.K_SPACE: self._fire_bullet() elif event.key == pygame.K_q: sys.exit() def _create_fleet(self): """创建外星人群""" # 创建第一个外星人并计算一行可容纳多少个外星人 alien = Alien(self) alien_width = alien.rect.width alien_height = alien.rect.height available_space_x = self.settings.screen_width - alien_width available_space_y = self.settings.screen_height - 3 * alien_height - self.ship.rect.height num_aliens_x = available_space_x // (2 * alien_width) num_aliens_rows = available_space_y // (2 * alien_height) # 创建外星人群 for row_number in range(num_aliens_rows): for alien_number in range(num_aliens_x): self._create_alien(alien_number, row_number, alien_width, alien_height) def _create_alien(self, alien_number, row_number, alien_width, alien_height): """创建一个外星人群""" alien = Alien(self) alien.x = alien_width + alien_number * alien_width * 2 alien.y = alien_height + 10 + row_number * alien_height * 2 alien.rect.x = alien.x alien.rect.y = alien.y self.aliens.add(alien) def _fire_bullet(self): """创建一颗子弹,并将其加入编组bullets中""" if len(self.bullets) < self.settings.bullet_allowed: new_bullet = Bullet(self) # !! 别忘了传入 ai_game self.bullets.add(new_bullet) def _update_bullets(self): """更新子弹的位置并删除消失的子弹""" self.bullets.update() # 对编组调用update()时,编组自动对其中的每个精灵调用 update() # 删除消失的子弹 for bullet in self.bullets.copy(): if bullet.rect.bottom 0: # 将ship_left - 1 self.stats.ships_left -= 1 # 更新记分牌 self.scoreboard.prep_ships() # 清空剩余的外星人和子弹 self.aliens.empty() self.bullets.empty() # 创建一群新的外星人,并将飞船放在屏幕底部中央 self._create_fleet() self.ship.center_ship() # 暂停半秒钟 sleep(0.5) else: self.stats.game_active = False # 游戏结束 pygame.mouse.set_visible(True) # 显示隐藏的光标 def _check_aliens_bottom(self): """检查是否有外星人到达了屏幕底端""" for alien in self.aliens.sprites(): if alien.rect.bottom >= self.screen.get_rect().bottom: self._ship_hit() # 像飞船被撞到一样处理 break def _check_play_button(self, mouse_pos): """在玩家单击 Play 按钮时开始新游戏""" button_checked = self.play_button.rect.collidepoint(mouse_pos) if button_checked and not self.stats.game_active: # 防止用户在游戏过程中点击了按钮所在区域时,游戏重新开始 # 隐藏鼠标光标 pygame.mouse.set_visible(False) # 重置游戏设置 self.settings.initialize_dynamic_settings() # 重置游戏统计信息 self.stats.reset_stats() self.stats.game_active = True self.scoreboard.prep_score() # 分数要改变 self.scoreboard.prep_level() # 等级要改变 self.scoreboard.prep_ships() # 余下飞船数要改变 # 清空余下的外星人和子弹 self.aliens.empty() self.bullets.empty() # 创建一群新的外星人,并将飞船放在屏幕底部中央 self._create_fleet() self.ship.center_ship() def _check_keyup_events(self, event): """响应松开""" 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) # 颜色,fill()方法用于处理surface,只接受一个实参——一种颜色 self.ship.blitme() # 绘制飞船 for bullet in self.bullets.sprites(): bullet.draw_bullet() self.aliens.draw(self.screen) # 如果游戏处于非活动状态,就绘制Play按钮 if not self.stats.game_active: self.play_button.draw_button() self.scoreboard.show_score_level_ships() # 显示得分、等级和飞船条数 pygame.display.flip() # 让最近绘制的屏幕可见 # 检查特殊变量 __name__,此变量为程序执行时设置。若此文件作为主程序执行,则此变量被设置为'__main__';若此文件被测试框架导入,则变量将不是'__main__' if __name__ == '__main__': # 创建游戏实例并运行游戏 ai = AlienInvasion() ai.run_game()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有