Pygame 外星人入侵(2)

Pygame 外星人入侵(2)

引言

从上一篇截止的地方开始,我们将在这一篇博文中:
1、编写飞船类的代码
2、初始化一架 垂直位置居中、水平位置靠屏幕底端的飞船
3、将这架飞船绘制并显示到游戏屏幕上

一、飞船类

我们现在有了一块 Pygame 游戏屏幕,现在要往屏幕上加元素,比如我们将要操控的飞船。

因此,我们需要单独定义一个飞船类,这个类中需要定义很多操作飞船相关的方法和属性。但是,当前只负责实现飞船的两个功能:
1、初始化到屏幕指定的位置
2、在屏幕上显示出飞船

1、飞船图片的准备

首先我们要在屏幕上显示飞船,显示的飞船图像是由一张图片来提供的。因此,我们需要先找到一张合适的图片来代表飞船。

在《Python编程:从入门到精通》这本书中对于适合作为素材的图片做了大致的描述。
首先,最好是背景色为透明的图片素材,这样我们可以通过PS等软件来填充背景色。
其次,也可以是底色和我们的屏幕背景色相同的素材。
而且,最好是 bmp 格式的图片,因为这是 Pygame.image 模块 一定可以支持的格式,其他格式不一样保证可以支持。

这里我使用的是书中提供的素材。我们保存时,将图片素材放到项目目录下的 images 文件中,取名为 ship.bmp。
在这里插入图片描述

2、定义飞船类

飞船类的代码将会很多,因此肯定不能将其放在主模块中,应该单独创建一个模块 ship.py ,用以存放飞船类。

那么我们该怎么实现飞船一出来就在指定的位置,这样的效果呢?

我们可以这样来实现:
1、在飞船类初始化(实例化)时,就设置好了飞船的位置
2、在飞船类中定义一个方法,使其能将自己显示到屏幕上

而这两个步骤的实现,我们分别放在 飞船类的构造函数中 和 飞船类的实例方法中 去实现

3、飞船类的构造函数

基于上一点的考虑,我们将在飞船类的__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

4、飞船类的实例方法

至此,我们已经实现了在飞船对象初始化之际,就将其设置在我们期望的位置上。
那么,接下来就需要将飞船对象绘制到我们的屏幕上。

这里,我们在飞船类中定义一个实例方法,作用是将飞船图片绘制到目标坐标上。

    def blitme(self):
        """
        将飞船显示到屏幕上的方法
        """
        # Surface 对象的方法 blit() ,可以将一个Surface对象覆盖到另一个Surface对象上
        # 注意是将参数中的对象覆盖到原对象上
        self.screen.blit(self.image, self.rect)

二、显示飞船到屏幕上

至此,我们有了一个完整的飞船类,可以在初始化之际在屏幕的指定位置显示。

现在,我们就尝试在主模块代码中做修改,实例化飞船类,并将其显示到屏幕上。

1、飞船类的导入

由于我们是在 ship 模块中定义的飞船类,因此在主模块中需要从 ship 模块中手动导入飞船类

# 从ship模块中导入飞船类,用以创建飞船
from ship import Ship

2、实例化飞船

基于我们定义的飞船类来创建一个飞船对象,也就是我们将来要操作的飞船

# 初始化飞船对象,创建一架飞船
my_ship = Ship(screen)

3、绘制飞船

有了飞船对象以后,我们就可以调用定义的绘制飞船的方法,将飞船图片在指定位置绘制。
这里有两个词需要注意区别:
1、绘制。是将指定的对象绘制到指定的位置,但是如果只绘制的话,我们是看不到的。
2、显示。将此时屏幕上绘制的东西全都显示出来。

因此,我们需要先绘制飞船到屏幕上,再显示屏幕,这样才可以看到应有的内容。

还需要注意的是,我们在屏幕上绘制了两样东西——背景 和 飞船,后绘制的对象会覆盖在先绘制的对象之上,因此要将绘制飞船的代码放在绘制背景的代码后面,并且在需要绘制的对象都绘制完以后,再刷新屏幕。

# 为纯黑的游戏屏幕填充上不一样的颜色
screen.fill(my_setting.background_color)

# 在背景之上绘制我们的飞船,注意这里的逻辑,必须是飞船在背景之后绘制,确保飞船在背景的上层
my_ship.blitme()

# 刷新屏幕,使得元素能够不断刷新位置
pygame.display.flip()

实现的效果:
在这里插入图片描述
至此,我们达到了代码的预期效果。

三、小结

这一部分,学习了如何通过坐标来设置 Surface 对象的位置,以及具体怎么在代码中实现,以及 Pygame 绘制多个对象的方法。还是那句话,最好的学习方法就是输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值