赞
踩
- 个人主页: ζ小菜鸡
- 大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Python的Pygame游戏框架。
- 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)
pygame是跨平台Python模块,专为电子游戏设置,包含图像、声音。创建在SDL(Simple Direct Medica Layer)基础上,允许实时电子游戏研发而无须被如C语言或汇编语言约束,基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)完全简化为游戏逻辑本身,所有的资源结构都可以由Python提供。
pygame的官方网址是www.pygame.org。在该网址中可以查找pygame的相关文档。pygame的安装非常简单,只需要如下一行命令:
pip install pygame
运行结果如下所示:
接下来,检测一下pygame是否安装成功。打开IDLE,输入如下命令:
import pygame
pygame.ver
如果运行如下图示,则说明安装成功了。
用pygame做游戏开发的优势在于不需要过多地考虑底层相关的内容,而可以把工作的重心放在游戏逻辑上。例如,pygame中集成了很多和底层相关的模块,如访问显示设备、管理事件、使用字体等。pygame的常用模块如下表所示:
模块名称 | 功能 |
---|---|
pygame.cdrom | 访问光驱 |
pygame.cursors | 加载光标 |
pygame.display | 访问显示设备 |
pygame.draw | 绘制形状、线和点 |
pygame.event | 管理事件 |
pygame.font | 使用字体 |
pygame.image | 加和存储图片 |
pygame.joystick | 使用游戏手柄或类似的东西 |
pygame.key | 读取键盘按键 |
pygame.mixer | 声音 |
pygame.mouse | 鼠标 |
pygame.movie | 播放视频 |
pygame.overlay | 访问高级视频叠加 |
pygame.rect | 管理矩形区域 |
pygame.sndarray | 操作声音数据 |
pygame.sprite | 操作移动图像 |
pygame.surface | 管理图像和屏幕 |
pygame.surfarray | 管理点阵图像数据 |
pygame.time | 管理时间和帧信息 |
pygame.transform | 缩放和移动图像 |
下面,使用pygame的display模块和event模块创建一个pygame窗口,代码如下:
# -*- coding: utf-8 -*- import sys # 导入sys模块 import pygame # 导入pygame模块 pygame.init() # 初始化pygame模块 size = width, height = 320, 240 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 # 执行死循环,确保窗口一直显示 while True: # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() pygame.quit() # 退出pygame
运行结果如下图所示:
pygame 有很多模块,每个模块又有很多方法,在此不能逐一讲解,所以,我们通过一个实例来学习pygame,然后再分解代码,讲解代码中的模块。
示例:制作一个跳跃的兔子游戏
创建一个游戏窗口,然后在窗口内创建一个小球。以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动。可以按照如下步骤实现该功能:
(1)创建一个游戏窗口,宽和高设置为640*480。代码如下:
'''
csdn作者:ζ小菜鸡
'''
# _*_ coding:utf-8 _*_
import sys # 导入模块sys
import pygame # 导入模块pygame
pygame.init() # 初始化pygame
size = width, height = 640, 480 # 设置窗口
screen = pygame.display.set_mode(size) # 显示窗口
上述代码中,首先导入pygame模块,然后调用init()方法初始化pygame模块。接下来,设置窗口的宽和高,最后使用display模块的常用方法如下表所示:
方法名称 | 功能 |
---|---|
pygame.display.init | 初始化display模块 |
pygame.display.quit | 结束display模块 |
pygame.display.get_init | 如果display模块已经被初始化,则返回True |
pygame.display.set_mode | 初始化一个准备显示的界面 |
pygame.display.get_surface | 获取当前的surface对象 |
pygame.display.flip | 更新整个待显示的surface对象到屏幕上 |
pygame.display.update | 更新部分内容显示到屏幕上,如果没有参数则与flip功能相同 |
(2)运行上述代码,会出现一个一闪而过的黑色窗口,这是因为程序执行完成后,会自动关闭。如果让窗口一直显示,需要使用while True语句让程序一直执行,此外,还需要设置关闭按钮,具体代码如下:
''' csdn作者:ζ小菜鸡 ''' # _*_ coding:utf-8 _*_ import sys # 导入模块sys import pygame # 导入模块pygame pygame.init() # 初始化pygame size = width, height = 640, 480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 # 执行死循环,确保窗口一直显示 while True: # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() pygame.quit() # 退出pygame
上述代码中,添加了轮询事件检测。pygame.event.get()方法能够获取事件队列,使用for…in语句遍历事件,然后根据type属性判断事件类型。这里事件处理方式与GUI类似,如果event.type等于pygame.QUIT,表示检测到关闭pygame窗口事件;pygame.KEYDOWN表示键盘按下事件,pygame.MOUSEBUTTONDOWN表示鼠标按下事件。
(3)在窗口中添加小兔子。先准备好一张ball.png图片,然后加载该图片,然后加载该图片,最后将图片显示在窗口中,具体代码如下:
''' csdn作者:ζ小菜鸡 ''' # _*_ coding:utf-8 _*_ import sys # 导入模块sys import pygame # 导入模块pygame from pygame.locals import * pygame.init() # 初始化pygame size = width, height = 640, 480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 color = (0, 0, 0) # 设置颜色 ball = pygame.image.load("ball.png") # 加载图片 space = pygame.transform.smoothscale(ball, (100, 100)) ballrect = space.get_rect() # 获取矩形区域 myfont = pygame.font.Font(None, 60) textImage = myfont.render("小兔子游戏", True, color) # 执行死循环,确保窗口一直显示 while True: # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() screen.fill(color) # 填充颜色 screen.blit(space, ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部窗口 pygame.quit() # 退出pygame
上述代码中使用image模块的load()方法加载图片,将返回值ball是一个Surface对象。Surface是用来代表图片的Pygame对象,可以对一个Surface对象进行涂画、变形、复制等各种操作。事实上,屏幕也只是一个Surface,pygame.display.set_mode就返回了一个屏幕Surface对象。如果将ball这个Surface对象画到screen Surface对象。需要使用blit()方法,最后使用display模块的flip方法更新整个待显示的Surface对象到屏幕上。 对象的常用方法如表所示:
方法名称 | 功能 |
---|---|
pygame.Surface.blit | 将一个图像画到另外一个图像上 |
pygame.Surface.convent | 转换图像的像素格式 |
pygame.Surface.convent_alpha | 转化图像的像素格式,包含alpha通道的转换 |
pygame.Surface.fill | 使颜色填充Surface |
pygame.Surface.get_rect | 获取Surface的矩形区域 |
运行上述代码,结果如下图所示:
(4)下面该让小兔子动起来了。ball.get_rect()方法返回值ballrect是一个Rect对象,该对象有一个move()方法可以使用移动矩形。move(x,y)函数有两个参数:第一参数是x轴移动距离;第二个参数是y轴移动距离。窗口左上角坐标为(0,0),如果使用move(100,50),如图所示:
为了实现小兔子不停的移动,将move()函数加到while循环中,具体代码如下:
''' csdn作者:ζ小菜鸡 ''' # _*_ coding:utf-8 _*_ import sys # 导入模块sys import pygame # 导入模块pygame from pygame.locals import * pygame.init() # 初始化pygame size = width, height = 640, 480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 color = (0, 0, 0) # 设置颜色 ball = pygame.image.load("ball.png") # 加载图片 space = pygame.transform.smoothscale(ball, (100, 100)) ballrect = space.get_rect() # 获取矩形区域 myfont = pygame.font.Font(None, 60) textImage = myfont.render("小兔子游戏", True, color) speed = [5, 5] # 设置x轴,y轴 # 执行死循环,确保窗口一直显示 while True: # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() ballrect = ballrect.move(speed) # 移动小兔子 screen.fill(color) # 填充颜色 screen.blit(space, ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部窗口 pygame.quit() # 退出pygame
(5)运行上述代码,发现小兔子在屏幕中一闪而过,此时,小兔子并没有消失,而是移动到窗口之外,此时添加碰撞检测功能。当小兔子与窗体任何一边缘发生碰撞,则更改小兔子的移动方向。具体代码如下:
''' csdn作者:ζ小菜鸡 ''' # _*_ coding:utf-8 _*_ import sys # 导入模块sys import pygame # 导入模块pygame from pygame.locals import * pygame.init() # 初始化pygame size = width, height = 640, 480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 color = (0, 0, 0) # 设置颜色 ball = pygame.image.load("ball.png") # 加载图片 space = pygame.transform.smoothscale(ball, (100, 100)) ballrect = space.get_rect() # 获取矩形区域 myfont = pygame.font.Font(None, 60) textImage = myfont.render("小兔子游戏", True, color) speed = [5, 5] # 设置x轴,y轴 # 执行死循环,确保窗口一直显示 while True: # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() ballrect = ballrect.move(speed) # 移动小兔子 # 碰撞左右边缘 if ballrect.left < 0 or ballrect.right > width: speed[0] = -speed[0] # 碰撞上下边缘 if ballrect.top < 0 or ballrect.bottom > height: speed[1] = -speed[1] screen.fill(color) # 填充颜色 screen.blit(space, ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部窗口 pygame.quit() # 退出pygame
上述代码中,添加了碰撞检测功能。如果碰撞到左右边缘,更改x轴数据为负数;如果碰撞到上下边缘,更改y轴数据为负数,则运行结果如下图:
(6)运行上述代码,发现好像有多个小兔子在飞快的移动,这是因为代码事件非常短,导致肉眼观察出现错觉,因此需要添加一个“时钟”来控制运行的时间。这时需要使用pygame的time模块。使用pygame时钟之前,必须创建Clock对象的一个实例,然后在While循环中设置多长时间运行一次。具体代码如下:
''' csdn作者:ζ小菜鸡 ''' # _*_ coding:utf-8 _*_ import sys # 导入模块sys import pygame # 导入模块pygame pygame.init() # 初始化pygame size = width, height = 640, 480 # 设置窗口 screen = pygame.display.set_mode(size) # 显示窗口 color = (0, 0, 0) # 设置颜色 ball = pygame.image.load("ball.png") # 加载图片 space = pygame.transform.smoothscale(ball, (100, 100)) ballrect = space.get_rect() # 获取矩形区域 myfont = pygame.font.Font(None, 60) textImage = myfont.render("小兔子游戏", True, color) speed = [5, 5] # 设置x轴,y轴 clock = pygame.time.Clock() # 设置时钟 # 执行死循环,确保窗口一直显示 while True: clock.tick(60) # 每60秒执行一次 # 检查事件 for event in pygame.event.get(): # 遍历所有事件 if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出 sys.exit() ballrect = ballrect.move(speed) # 移动小兔子 # 碰撞左右边缘 if ballrect.left < 0 or ballrect.right > width: speed[0] = -speed[0] # 碰撞上下边缘 if ballrect.top < 0 or ballrect.bottom > height: speed[1] = -speed[1] screen.fill(color) # 填充颜色 screen.blit(space, ballrect) # 将图片画到窗口上 pygame.display.flip() # 更新全部窗口 pygame.quit() # 退出pygame
Python的Pygame游戏框架(汇总),到此就结束了,感谢大家阅读,如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。