从上一篇截止的地方开始,我们将在这一篇博文中:
1、编写飞船类的代码
2、初始化一架 垂直位置居中、水平位置靠屏幕底端的飞船
3、将这架飞船绘制并显示到游戏屏幕上
我们现在有了一块 Pygame 游戏屏幕,现在要往屏幕上加元素,比如我们将要操控的飞船。
因此,我们需要单独定义一个飞船类,这个类中需要定义很多操作飞船相关的方法和属性。但是,当前只负责实现飞船的两个功能:
1、初始化到屏幕指定的位置
2、在屏幕上显示出飞船
首先我们要在屏幕上显示飞船,显示的飞船图像是由一张图片来提供的。因此,我们需要先找到一张合适的图片来代表飞船。
在《Python编程:从入门到精通》这本书中对于适合作为素材的图片做了大致的描述。
首先,最好是背景色为透明的图片素材,这样我们可以通过PS等软件来填充背景色。
其次,也可以是底色和我们的屏幕背景色相同的素材。
而且,最好是 bmp 格式的图片,因为这是 Pygame.image 模块 一定可以支持的格式,其他格式不一样保证可以支持。
这里我使用的是书中提供的素材。我们保存时,将图片素材放到项目目录下的 images 文件中,取名为 ship.bmp。
飞船类的代码将会很多,因此肯定不能将其放在主模块中,应该单独创建一个模块 ship.py ,用以存放飞船类。
那么我们该怎么实现飞船一出来就在指定的位置,这样的效果呢?
我们可以这样来实现:
1、在飞船类初始化(实例化)时,就设置好了飞船的位置
2、在飞船类中定义一个方法,使其能将自己显示到屏幕上
而这两个步骤的实现,我们分别放在 飞船类的构造函数中 和 飞船类的实例方法中 去实现
基于上一点的考虑,我们将在飞船类的__init__方法中实现将飞船的位置设置为我们指定的位置。
那么我们要在构造函数中做的事情包括:
1、加载飞船的图片素材
2、传入我们将显示的屏幕
3、获取飞船的坐标信息,以便我们设置
4、获取屏幕的坐标信息,以便我们使用
主要用到的 pygame 模块包括:
1、Surface 类,处理飞船图片及其坐标
2、image 模块,加载图片素材
一个 Surface 类型的对象,它的坐标有这么6个值:
1、centerx 对象中心点的 x 坐标
2、centery 对象中心点的 y 坐标
3、top 对象顶边坐标
4、bottom 对象底边坐标
5、left 对象左边坐标
6、right 对象右边坐标
而如果我们想将飞船设置在屏幕中央且紧贴底边的话,可以这样实现:
垂直方向上,可以设置 centerx 的值,使其与屏幕的 centerx 值相等。
水平方向上,可以设置 bottom 的值,使其与屏幕的 bottom 值相等。
根据上面的分析,我们编写飞船类以及其构造函数:
import pygame
class Ship(object):
# 初始化飞船,飞船刚出现时,是位于屏幕的中间靠最底边的位置
def __init__(self, screen): # 这里需要传入屏幕,是因为我们设置飞船的坐标需要用到屏幕的坐标
# 飞船将来要在哪个屏幕上进行显示
self.screen = screen
# 加载飞船显示时的图片资源
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
# 飞船的底边 与 屏幕的底边相同
self.rect.bottom = self.screen_rect.bottom
至此,我们已经实现了在飞船对象初始化之际,就将其设置在我们期望的位置上。
那么,接下来就需要将飞船对象绘制到我们的屏幕上。
这里,我们在飞船类中定义一个实例方法,作用是将飞船图片绘制到目标坐标上。
def blitme(self):
"""
将飞船显示到屏幕上的方法
"""
# Surface 对象的方法 blit() ,可以将一个Surface对象覆盖到另一个Surface对象上
# 注意是将参数中的对象覆盖到原对象上
self.screen.blit(self.image, self.rect)
至此,我们有了一个完整的飞船类,可以在初始化之际在屏幕的指定位置显示。
现在,我们就尝试在主模块代码中做修改,实例化飞船类,并将其显示到屏幕上。
由于我们是在 ship 模块中定义的飞船类,因此在主模块中需要从 ship 模块中手动导入飞船类
# 从ship模块中导入飞船类,用以创建飞船
from ship import Ship
基于我们定义的飞船类来创建一个飞船对象,也就是我们将来要操作的飞船
# 初始化飞船对象,创建一架飞船
my_ship = Ship(screen)
有了飞船对象以后,我们就可以调用定义的绘制飞船的方法,将飞船图片在指定位置绘制。
这里有两个词需要注意区别:
1、绘制。是将指定的对象绘制到指定的位置,但是如果只绘制的话,我们是看不到的。
2、显示。将此时屏幕上绘制的东西全都显示出来。
因此,我们需要先绘制飞船到屏幕上,再显示屏幕,这样才可以看到应有的内容。
还需要注意的是,我们在屏幕上绘制了两样东西——背景 和 飞船,后绘制的对象会覆盖在先绘制的对象之上,因此要将绘制飞船的代码放在绘制背景的代码后面,并且在需要绘制的对象都绘制完以后,再刷新屏幕。
# 为纯黑的游戏屏幕填充上不一样的颜色
screen.fill(my_setting.background_color)
# 在背景之上绘制我们的飞船,注意这里的逻辑,必须是飞船在背景之后绘制,确保飞船在背景的上层
my_ship.blitme()
# 刷新屏幕,使得元素能够不断刷新位置
pygame.display.flip()
这一部分,学习了如何通过坐标来设置 Surface 对象的位置,以及具体怎么在代码中实现,以及 Pygame 绘制多个对象的方法。还是那句话,最好的学习方法就是输出。