Pygame是跨平台Python模块,原为代替突然停止的 pySDL,建立在SDL基础上,允许实时电子游戏研发而无需被低级语言所束缚。Pygame的相关基础资源:源码,文档,资讯等都可在官网查看
pygame官网: https://www.pygame.org/news
pygame文档: https://www.pygame.org/docs/
pygame的功能:
绘制图形、显示图片、动画效果、播放声音、碰撞检测、与键盘或鼠标或游戏把柄等外设交互
pygame模块:
在开始pygame编程游戏时,先安装一下pygame,命令行窗口输入:
pip install pygame
显示安装完成。此篇基于python基础上,未完成Python基础入坑的请参看:
入坑Python的基础简介与环境设置
习以为常,编程的开始都是从向世界问好开始,下面就用pygame来玩不一样的Hello World~~~
代码:
import pygame #导入pygame库
from pygame.locals import* #导入一些常用的函数和变量
pygame.init() #初始化pygame
pygame.display.set_caption("锁钥 の Hello World !!!") #设置窗口标题
BG = (0,0,255) #定义背景的RGB颜色
screen = pygame.display.set_mode((640,480)) #创建窗口大小为:640*480
screen.fill(BG) #填充背景
pygame.display.flip() #更新界面
の 的输入方式:键盘E键(不行则先输入键D+E,然后再输入键E)
运行界面: 窗口标题+蓝色界面
从python的Shell(命令解析器)窗口可见程序一运行就结束,但程序界面并没有立即关闭,这是pygame的事件循环与IDLE的事件循环发生冲突,使界面一直存在。若直接双击保存的 .py文件打开程序,程序的正常现象是一闪而过。
窗口是出来了,标题也显示了Hello World 。这就结束了?
进阶版来定义一下手动关闭程序,避免双击启动程序时出现一闪而过&_&,并更换一下单调的颜色界面,找张视野宽阔的炫酷图片来当界面 ~~~
代码:
import pygame #导入pygame库
from pygame.locals import* #导入一些常用的函数和变量
import sys #使用sys模块的exit函数来退出程序
pygame.init() #初始化pygame
pygame.display.set_caption("锁钥 の Hello World !!!") #设置窗口标题
SCREEN_SIZE = (640,480) #定义窗口大小的变量
background_image = 'bg.jpg' #指定背景图像文件名称
screen = pygame.display.set_mode(SCREEN_SIZE) #创建窗口
background = pygame.image.load(background_image).convert() #加载背景图并用convert函数将图像数据转换为Surface对象返回
while True: #主循环
for event in pygame.event.get():
if event.type == pygame.QUIT: #接收到退出事件后退出程序
sys.exit()
screen.blit(background,(0,0)) #将背景图画上去
pygame.display.update() #刷新页面
将代码和背景图放在同一个文件夹下
库的导入方式: import +库名 或 from +库名 + import*,*代表全部函数和变量;若知道所需要库的模块可直接导入该模块,例如上面使用sys库的exit模块也可直接写成 from sys import exit
blit函数: 第一个参数为一个Surface对象,第二个为左上角位置坐标,画完后要用update或flip刷新一下,否则画面一片漆黑。
运行界面:
在Sheel窗口可见程序一直还没有结束,需要手动点击结束
这就没了,怎么可能,程序都还没动起来,怎么会没了呢 >_<
最终版让程序动起来
运行界面:
将代码、背景图和角色图放在同一个文件夹下
完整代码:
import pygame #导入pygame库
from pygame.locals import* #导入一些常用的函数和变量
from sys import exit #使用sys模块的exit函数来退出程序
pygame.init() #初始化pygame
pygame.display.set_caption("锁钥 の Hello World !!!") #设置窗口标题
SCREEN_SIZE = width,height = 640,480 #定义窗口大小变量
SPEED = [-2,1] #定义移动速度
background_image = 'bg.jpg' #指定背景图像文件名称,使用RGB颜色来填充背景也行
screen = pygame.display.set_mode(SCREEN_SIZE,0,32) #创建窗口
role = pygame.image.load("role.png") #加载图片并转换为Surface对象返回
background = pygame.image.load(background_image).convert() #加载背景图并用convert函数将图像数据转换为Surface对象返回
position = role.get_rect() #获得图像的位置矩形(左上角和右下角坐标)
while True: #游戏主循环
for event in pygame.event.get():
if event.type == pygame.QUIT: #接收到退出事件后退出程序
exit()
position = position.move(SPEED) #移动图像
if position.left<0 or position.right>width: #左右边界判断,避免出界
role = pygame.transform.flip(role,True,False) #翻转图像 变量1:返回surface对象;变量2:是否水平翻转;变量3:是否垂直翻转
SPEED[0] = -SPEED[0] #反方向移动
if position.top<0 or position.bottom>height: #上下边界判断,避免出界
SPEED[1] = -SPEED[1]
screen.blit(background,(0,0)) #将背景图画上去
screen.blit(role,position) #更新图像
pygame.display.flip() #更新界面 或用pygame.display.update() #刷新页面
pygame.time.delay(5) #延迟10毫秒
核心代码分析:
set_mode(resolution=(0,0),flags=0,depth=0): 返回一个Surface对象,代表桌面上出现的那个窗口,包含三个参数。
参数1:一个元组,必须填写,代表分辨率;
参数2:一个标志位,有如下表6种特性,若不用什么特性,就指定为0;
参数3:色深,一般填写 32。
convert函数: 是将图像数据都转化为 Surface 对象,每次加载完图像后就要做这个事件(十分常用了,即使不写 pygame也会默认已写)。
rect()函数: 返回图像的位置矩形(左上角和右下角坐标),指定方法可以用一个四元素的元组,或者两个二元素的元组,前两个数为左上坐标,后两位为右下坐标;一般来说在制定一个区域的时候,矩形是必须的,比如在屏幕的一部分画东西。
程序的刷新: HW1的pygame.display .flip() 和这里的 pygame.display .update() 都是刷新。但当标志位使用双缓冲(更快)DOUBLEBUF 的游戏显示了,记得要使用pygame.display.flip()来刷新显示,pygame.display.update()是将数据画到前面显示,而这个是交替显示的意思。
适时更新请关注微信公众“百里锁钥”,公众号后台回复“pygame首发”获取程序源码、图片和打包后的可执行文件( 如何打包?传送门)