前言
在前面的文章中,我们已经对项目进行了简单的分析,并且已经编写好了基础的代码,接下来的工作就是进一步的分析游戏的业务功能,在基础代码之上,进行填充。
背景颜色
我们简单的创建窗口以后,除了命名外暂时没有做特殊处理,背景颜色也是黑色的一片。我们使用书籍中的背景颜色进行填充。
我们找到main
模块,将绘制屏幕的函数封装到gf
模块中,因为每次循环以后除了简单的更新窗口屏幕,我们还需要刷新飞船,外星人,子弹的位置。
封装屏幕更新函数update_screen
,填充背景色。
gf
模块代码如下
import sys
import pygamedef check_event():--snip--def update_screen(setting, screen):"""绘制屏幕"""# 填充背景色screen.fill(setting.bg_color)# 让最近绘制的屏幕可见pygame.display.flip()
main
模块代码如下
import pygame
import alien_invasion.game_functions as gf
from alien_invasion.setting import Settingdef run_game():"""启动游戏"""# 初始化pygamepygame.init()# 定义一个系统设置对象setting = Setting()# 新建窗口screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))# 窗口命名pygame.display.set_caption(setting.caption)while True:# 处理监听事件gf.check_event()# 刷新屏幕gf.update_screen(setting, screen)if __name__ == '__main__':run_game()
这个时候执行程序,可以看到背景色已经不是黑色了。
飞船的加载
在游戏窗口弹出的时候,我们需要加载一个飞船对象,并且我们需要将飞船加载到指定的位置,通常来说,我们会将飞船放置到窗口的正中间。
我们要怎么实现这个功能呢?分成两步。
- 我们需要在飞船的属性中,设置初始位置。
- 我们需要一个函数,在窗口中绘制填充飞船。
修改代码如下:
import pygameclass Ship:def __init__(self, setting, screen):"""初始化飞船并设置其初始位置"""self.screen = screenself.setting = setting# 加载图片并外接矩形self.image = pygame.transform.scale(pygame.image.load('E:/python_project/alien_invasion/assets/image/ship.bmp'), (50, 50))# 飞船外接的矩形self.rect = self.image.get_rect()# 窗口矩形self.screen_rect = screen.get_rect()# 将每艘新飞船放在屏幕底部中央self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomdef move(self):"""移动飞船"""def blitme(self):"""在指定位置绘制飞船"""self.screen.blit(self.image, self.rect)
前三行代码比较简单,先是飞船类中的screen
对象和setting
对相关使用构造函数传入的值进行赋值,然后是加载一个图片对象,这个图片对象明显就是我们飞船图像。
从这段代码self.rect = self.image.get_rect()
开始看起。
我们加载飞船图片后,会在图片外接一个矩形。这个矩形的边界,就可以理解为我们飞船的边界。后面对于飞船位置的判断,都是使用这个外接矩形的边界来判定的,比如飞船移动到左边窗口边框,上边窗口边框等等。
接下来是self.screen_rect = screen.get_rect()
。
这个就是定义一个矩形使用游戏窗口矩形赋值,这个矩形的属性用于飞船位置的定位以及限制飞船的运行范围。
解释一下本次修改的代码:
-
self.rect.centerx = self.screen_rect.centerx
这段代码要和前面连着一起解读。前面已经定义图片的矩形和游戏窗口的矩形,这段代码也是一个赋值的代码,重点在于
centerx
,centerx
是在Pygame
中获取屏幕宽度中心位置的一种方法。centerx
也就是说这段代码将飞船外接矩形的中心坐标点的x坐标设置成了游戏弹窗的中心点x坐标。 -
self.rect.bottom = self.screen_rect.bottom
这段代码也需要和前面的一起连着,同样也是一个赋值的代码,这次赋值的是
bottom
。在Pygame
中使用.bottom
用于获取屏幕(或任何其他 Surface)底部边缘的 y 坐标。也就是说这段代码是将飞船外接矩形的底部y坐标用弹窗底部的y坐标。这两行代码是不是就是将图片外接矩形设置在在了底部中央的位置?x坐标是弹窗中心点的x坐标,y坐标是弹窗底部y坐标,稍微理解一下,画个图可能更好理解。
-
self.screen.blit(self.image, self.rect)
这个很好理解了,之前
pygame
基础讲过了,简单的填充代码。那么调用这个函数,就是在指定的screen
的底部中央加载一个飞船。
这些代码理解后,我们现在需要做的就是,在main模块中定义一个飞船类,然后在屏幕更新的函数中,调用飞船对象的blitme
函数即可。
那么main模块代码更新如下。
import pygame
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Shipdef run_game():"""启动游戏"""# 初始化pygamepygame.init()# 定义一个系统设置对象setting = Setting()# 新建窗口screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))# 窗口命名pygame.display.set_caption(setting.caption)# 定义一个飞船对象ship = Ship(setting, screen)while True:# 处理监听事件gf.check_event()# 刷新屏幕gf.update_screen(setting, screen, ship)if __name__ == '__main__':run_game()
在main
模块中,定义了一个飞船类,并将这个类作为参数传递到update_screen
函数中,对应update_screen
函数也应该做出修改
import sys
import pygame--snip--def update_screen(setting, screen, ship):"""更新屏幕"""# 填充背景色screen.fill(setting.bg_color)# 加载飞船ship.blitme()# 让最近绘制的屏幕可见pygame.display.flip()
在更新屏幕的函数中,我们使用ship对象调用自身的函数绘制一个飞船在游戏窗口底部中央的位置。
实际效果如下:
当然,由于我们前期已经做好了项目分析以及架构设计,我们的项目目录基本不会再变化,我们只需要想办法通过代码实现相应的功能,并讲代码编写在相应的模块即可。
结尾
通过本篇文章,我们已经成功将飞船加载到了指定的位置,那么接下来,我们就该让飞船动起来了!各位加油!!!