Python学习之路日志—《外星人入侵》游戏项目总结回顾(3)
2020-08-25 23:10
776 查看
在这篇博客中,我将简单分析一下 ship.py、alien.py 和 bullet.py 三个文件:
2. ship:
文件ship.py包含
Ship类,这个类包含方法
__init__()、管理飞船位置的方法
update()以及在屏幕上绘制飞船的方法
blitme()等。表示飞船的图像存储在文件夹images下的文件ship.bmp中。以下是ship.py的全部内容:
import pygame class Ship(): def __init__(self,ai_settings,screen):# 形参列表中添加ai_settings '''初始化飞船并设置其初始位置''' self.screen = screen self.ai_settings = ai_settings #存储在一个属性中,以便能够在update() 中使用它 #加载飞船图像并获取其外接矩形 self.image = pygame.image.load('images/ship.bmp') self.rect = self.image.get_rect()#获取飞船外接矩形 self.screen_rect = screen.get_rect()#获取屏幕外接矩形 #将每艘新飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx #将飞船放在x坐标居中位置 self.rect.bottom = self.screen_rect.bottom #将飞船放在屏幕底部 self.center = float(self.rect.centerx)#使用函数float()将值转换为小数,并将结果存储到self.center中 # 移动标志 self.moving_right = False #添加了属性self.moving_right,并将其初始值设置为False self.moving_left = False #添加了标志self.moving_left def update(self): #我们添加了方法update() ,它在前述标志为True时向右移动飞船 #根据移动标志调整飞船位置 if self.moving_right and self.rect.right < self.screen_rect.right: self.center += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: self.center -= self.ai_settings.ship_speed_factor self.rect.centerx = self.center #更新self.center 后,我们再根据它来 更新控制飞船位置的self.rect.centerx def blitme(self): '''根据指定位置绘制图像''' self.screen.blit(self.image, self.rect) def center_ship(self): """让飞船在屏幕上居中""" self.center = self.screen_rect.cente
可以看到,方法
__init__主要用于初始化飞船并设置其初始位置,其做了以下几件事情:
- 加载存储在images中的飞船图像ship.bmp并获取飞船和屏幕的外接矩形(第11-13行)。
- 将飞船放在x坐标居中位置并将飞船放在屏幕底部以达到将每艘新飞船放在屏幕底部中央的效果(第16-19行)。
- 将移动标志
self.moving_right
与self.moving_left
的初始值都设置为 False(第22-23行)。
方法
update()则是用来调整飞船的移动位置:在飞船在屏幕范围之内时,它在上述移动标志为 True 时移动飞船向左/右移动(第25-32行)。
而方法
blitme()和
center_ship()分别根据指定位置绘制飞船的图像和让飞船在屏幕上居中(第34-41行)。
3. alien:
除位置不同外,这个类的大部分代码都与
Ship类相似,以下是alien.py的全部内容:
import pygame from pygame.sprite import Sprite class Alien(Sprite): def __init__(self,ai_settings,screen): """初始化外星人并设置其起始位置""" super(Alien,self).__init__() self.screen = screen self.ai_settings = ai_settings # 加载外星人图像,并设置其rect属性 self.image = pygame.image.load('images/alien.bmp') self.rect = self.image.get_rect() # 每个外星人最初都在屏幕左上角附近 self.rect.x = self.rect.width # 将每个外星人的左边距都设置为外星人的宽度 self.rect.y = self.rect.height # 将上边距设置为外星人的高度 #存储外星人的准确位置 self.x = float(self.rect.x) def check_edges(self): """如果外星人位于屏幕边缘,就返回True""" screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True def update(self): """向左或右移动外星人""" self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.x def blitme(self): '''根据指定位置绘制外星人''' self.screen.blit(self.image, self.rect)
同样地,在方法
__init__()中:
- 加载存储在images中的外星人图像alien.bmp并获取外星人的外接矩形(第15-16行)。
- 在第19-20行的代码中,将每个外星人的左边距都设置为外星人的宽度并将上边距设置为外星人的高度,使每个外星人最初都在屏幕左上角附近。
为了不让外星人离开屏幕范围,在第25-31行的方法
check_edges(),限制了外星人的移动范围。
在
update()这个方法中(第33-36行),利用
alien_speed_factor与
fleet_direction来控制外星人的移动方向。
最后,利用方法
blitme()(第38-40行)来根据指定位置绘制外星人。
4. bullet:
这是一个对飞船发射的子弹进行管理的类,以下是其全部内容:
import pygame from pygame.sprite import Sprite class Bullet(Sprite): #一个对飞船发射的子弹进行管理的类 def __init__ (self,ai_settings,screen,ship): super(Bullet,self).__init__() #调用super() 来继承Sprite self.screen = screen #在(0,0)处创建一个表示子弹的矩形,再设置正确的位置 self.rect = pygame.Rect(0,0,ai_settings.bullet_width, ai_settings.bullet_height) #我们在(0, 0)处创建这个矩形,但接下来的两行代码将其移到了正确的位置 self.rect.centerx = ship.rect.centerx #将子弹的centerx 设置为飞船的rect.centerx self.rect.top = ship.rect.top # 子弹应从飞船顶部射出,因此我们将表示子弹的rect的top属性设置为飞船的rect的top属性 #存储用小数表示的子弹位置 self.y = float(self.rect.y) #将子弹的y坐标存储为小数值,以便能够微调子弹的速度 self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor def update(self): self.y -= self.speed_factor #更新表示子弹位置的小数值 self.rect.y = self.y #更新表示子弹的rect的位置 def draw_bullet(self): pygame.draw.rect(self.screen,self.color,self.rect) #使用存储在self.color中的颜色填充表示子弹的rect占据的屏幕部分
在这个类的方法
__init__中,第12-13行在(0,0)处创建一个表示子弹的矩形,并设置了它的高度和宽度。在第14-15行中的两行代码将其移到了正确的位置。在第20-21行中,我们给予创建的子弹颜色与速度。
接着,方法
update()和
draw_bullet()分别更新表示子弹位置的小数值与使用存储在
self.color中的颜色填充表示子弹的
rect占据的屏幕部分。
相关文章推荐
- leetcode_111. 二叉树的最小深度 python
- python 正则表达式
- leetcode_491. 递增子序列 python3
- 2020-08-25 python 爬虫,pyecharts 画图(网站链接,百度)
- python-pandas11-数据聚合-分组计算
- Python学习之路日志—《外星人入侵》游戏项目总结回顾(2)
- python——scrapy中Request参数
- 从几百个Excel中查找数据,用Python一分钟搞定
- Python基础知识都在这里!(python学习资料赠送)
- python-pandas模块10-pandas读取与写入文件
- python3数据分析之Pandas
- numpy 第二次作业
- java/php/net/python海洋食品销售网设计
- java/php/net/python广东阳光外国语学校新闻发布设计
- (爬虫二)Python爬虫入门二
- python-pandas模块9-数据拆分-异常值筛选-过滤
- java/php/net/pythont果蔬预约种植管理系统设计
- java/php/net/python郎朗球鞋交易系统设计
- java/php/net/python课程教学质量综合测评系统设计
- java/php/net/pythont固定资产管理系统设计