赞
踩
在前面的文章中,我们已经对项目进行了简单的分析,并且已经编写好了基础的代码,接下来的工作就是进一步的分析游戏的业务功能,在基础代码之上,进行填充。
我们简单的创建窗口以后,除了命名外暂时没有做特殊处理,背景颜色也是黑色的一片。我们使用书籍中的背景颜色进行填充。
我们找到main
模块,将绘制屏幕的函数封装到gf
模块中,因为每次循环以后除了简单的更新窗口屏幕,我们还需要刷新飞船,外星人,子弹的位置。
封装屏幕更新函数update_screen
,填充背景色。
gf
模块代码如下
import sys
import pygame
def 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 Setting def run_game(): """启动游戏""" # 初始化pygame pygame.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 pygame class Ship: def __init__(self, setting, screen): """初始化飞船并设置其初始位置""" self.screen = screen self.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.centerx self.rect.bottom = self.screen_rect.bottom def 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 Ship def run_game(): """启动游戏""" # 初始化pygame pygame.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对象调用自身的函数绘制一个飞船在游戏窗口底部中央的位置。
实际效果如下:
当然,由于我们前期已经做好了项目分析以及架构设计,我们的项目目录基本不会再变化,我们只需要想办法通过代码实现相应的功能,并讲代码编写在相应的模块即可。
通过本篇文章,我们已经成功将飞船加载到了指定的位置,那么接下来,我们就该让飞船动起来了!各位加油!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。