Python学习之路日志—利用pygame开发《外星人入侵》游戏项目(1)
1.1 创建pygame窗口及响应用户输入:
首先,我创建一个空的pygame窗口。使用pygame编写的游戏的基本结构如下:
import sys import pygame def run_game(): pygame.init() #初始化 screen = pygame.display.set_mode((1200,800)) #调用这个来创建名为screen的窗口 pygame.display.set_caption('Alien Invasion') #命名游戏 #开始游戏的主循环 while True: #侦听事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() pygame.display.flip() #不断更新屏幕,以显示元素的新位置 run_game() #初始化游戏并开始主循环
简要分析一下:
-
代码行
pygame.init()
初始化背景设置,让Pygame能够正确地工作。 -
我又调用了
pygame.display.set_mode()
来创建一个名为screen 的显示窗口,这个游戏的所有图形元素都将在其中绘制。对象screen 是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。display.set_mode()
返回的surface表示整个游戏窗口。 -
这个游戏由一个while 循环控制,其中包含一个事件循环以及管理屏幕更新的代码。事件是用户玩游戏时执行的操作,如按键或移动鼠标。为让程序响应事件,我们编写一个事件循环,以侦听事件,并根据发生的事件执行相应的任务。其中的for循环就是一个事件循环。
-
为访问Pygame检测到的事件,我们使用方法
pygame.event.get()
。所有键盘和鼠标事件都将促使for 循环运行。 -
我接着调用了
pygame.display.flip()
,命令Pygame让最近绘制的屏幕可见。pygame.display.flip()
将不断更新屏幕,以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。 -
最后一行调用了
run_game()
,这将初始化游戏并开始主循环。
如果此时运行这些代码,你将看到一个空的Pygame窗口(如下图):
1.2 设置背景色:
首先,我们创建了一种背景色,并将其存储在
bg_color中。该颜色只需指定一次,因此我们在进入主while循环前定义它。
我们又调用方法
screen.fill(),用背景色填充屏幕;这个方法只接受一个实参:一种颜色。
完成后效果如下图所示:
1.3 创建设置类:
编写一个名为settings的模块,其中包含一个名为Settings 的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。这样,我们就能传递一个设置对象,而不是众多不同的设置:
在主程序文件中,我们导入Settings 类,调用
pygame.init(),再创建一个Settings实例,并将其存储在变量
ai_settings中。创建屏幕时,使用了
ai_settings的属性
screen_width和
screen_height;接下来填充屏幕时,也使用了
ai_settings来访问背景色。
2.1 创建飞船图像:
下面将飞船加入到游戏中,选择用于表示飞船的图像后,需要将其显示到屏幕上。我们将创建一个名为ship的模块,其中包含Ship 类,它负责管理飞船的大部分行为:
简要分析一下:
-
首先,我们导入了模块pygame 。Ship 的方法
__init__()
接受两个参数:引用self 和screen ,其中后者指定了要将飞船绘制到什么地方。为加载图像,我们调用了pygame.image.load()
, -
加载图像后,我们使用
get_rect()
获取相应surface的属性rect , -
要将游戏元素居中,可设置相应rect 对象的属性center 、centerx 或centery 。要让游戏元素与屏幕边缘对齐,可使用属性top 、bottom 、left 或right ;要调整游戏元素的水平或垂直位置,可使用属性x 和y ,它们分别是相应矩形左上角的 x 和 y 坐标。
-
我们将把飞船放在屏幕底部中央。为此,首先将表示屏幕的矩形存储在
self.screen_rect
中,再将self.rect.centerx
(飞船中心的x坐标)设置为表示屏幕的矩形的属性centerx ,并将self.rect.bottom
(飞船下边缘的y 坐标)设置为表示屏幕的矩形的属性bottom 。Pygame将使用这些rect 属性来放置飞船图像, 使其与屏幕下边缘对齐并水平居中。 -
最后,我们定义了方法
blitme()
,它根据self.rect
指定的位置将图像绘制到屏幕上。
下面来更新
alien_invasion.py,使其创建一艘飞船,并调用其方法
blitme():
我们导入Ship 类,并在创建屏幕后创建一个名为ship 的Ship 实例。必须在主while 循环前面创建该实例,以免每次循环时都创建一艘飞船。填充背景后,我们调用
ship.blitme()将飞船绘制到屏幕上,确保它出现在背景前面。
现在如果运行,将看到飞船位于空游戏屏幕底部中央:
- python datetime库datetime类
- python datetime库time类
- python进阶-15.pandas-汇总计算,描述统计-唯一值,值计算-缺失值处理
- python进阶-14.pandas-排序-重复轴判断
- python datetime库date类
- python进阶-13.pandas-函数应用和映射
- python.pycharts.Map使用
- Python之Pandas入门篇
- 如何使用python和opencv4实现照片长曝光效果呢?
- Python 快速入门
- python random库
- 程序员笔试之软件开发方向-python 单选题收集整理(六)
- python解析命令行参数
- python爬虫-滑动验证码
- python输出带有颜色的内容
- Python Celery异步任务队列使用方法解析
- 基于Python pyecharts实现多种图例代码解析
- Python grequests模块使用场景及代码实例
- 基于Python实现下载网易音乐代码实例
- Python如何测试stdout输出