在这篇博客中,我将简单分析一下 ship.py、alien.py 和 bullet.py 三个文件:
2. ship:
文件ship.py包含
Ship
类,这个类包含方法
__init__()
、管理飞船位置的方法
update()
以及在屏幕上绘制飞船的方法
blitme()
等。表示飞船的图像存储在文件夹images下的文件ship.bmp中。以下是ship.py的全部内容:
import pygameclass Ship():def __init__(self,ai_settings,screen):# 形参列表中添加ai_settings\'\'\'初始化飞船并设置其初始位置\'\'\'self.screen = screenself.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,并将其初始值设置为Falseself.moving_left = False #添加了标志self.moving_leftdef update(self): #我们添加了方法update() ,它在前述标志为True时向右移动飞船#根据移动标志调整飞船位置if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factorself.rect.centerx = self.center #更新self.center 后,我们再根据它来 更新控制飞船位置的self.rect.centerxdef 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 pygamefrom pygame.sprite import Spriteclass Alien(Sprite):def __init__(self,ai_settings,screen):\"\"\"初始化外星人并设置其起始位置\"\"\"super(Alien,self).__init__()self.screen = screenself.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 Trueelif self.rect.left <= 0:return Truedef update(self):\"\"\"向左或右移动外星人\"\"\"self.x += (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)self.rect.x = self.xdef 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 pygamefrom pygame.sprite import Spriteclass Bullet(Sprite): #一个对飞船发射的子弹进行管理的类def __init__ (self,ai_settings,screen,ship):super(Bullet,self).__init__() #调用super() 来继承Spriteself.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.centerxself.rect.top = ship.rect.top # 子弹应从飞船顶部射出,因此我们将表示子弹的rect的top属性设置为飞船的rect的top属性#存储用小数表示的子弹位置self.y = float(self.rect.y) #将子弹的y坐标存储为小数值,以便能够微调子弹的速度self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef 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
占据的屏幕部分。