您的位置:首页 > 编程语言 > Python开发

Python学习之路日志—《外星人入侵》游戏项目总结回顾(3)

2020-08-25 23:10 776 查看

在这篇博客中,我将简单分析一下 ship.pyalien.pybullet.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__
主要用于初始化飞船并设置其初始位置,其做了以下几件事情:

  1. 加载存储在images中的飞船图像ship.bmp并获取飞船和屏幕的外接矩形(第11-13行)。
  2. 将飞船放在x坐标居中位置并将飞船放在屏幕底部以达到将每艘新飞船放在屏幕底部中央的效果(第16-19行)。
  3. 将移动标志
    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__()
中:

  1. 加载存储在images中的外星人图像alien.bmp并获取外星人的外接矩形(第15-16行)。
  2. 在第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
占据的屏幕部分。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: