Python学习笔记43:游戏篇之外星人入侵(四)
前言
在前面的文章中,我们已经对项目进行了简单的分析,并且已经编写好了基础的代码,接下来的工作就是进一步的分析游戏的业务功能,在基础代码之上,进行填充。
背景颜色
我们简单的创建窗口以后,除了命名外暂时没有做特殊处理,背景颜色也是黑色的一片。我们使用书籍中的背景颜色进行填充。
我们找到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对象调用自身的函数绘制一个飞船在游戏窗口底部中央的位置。
实际效果如下:
当然,由于我们前期已经做好了项目分析以及架构设计,我们的项目目录基本不会再变化,我们只需要想办法通过代码实现相应的功能,并讲代码编写在相应的模块即可。
结尾
通过本篇文章,我们已经成功将飞船加载到了指定的位置,那么接下来,我们就该让飞船动起来了!各位加油!!!
原文地址:https://blog.csdn.net/weixin_48668564/article/details/140645555
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!