Python游戏系列之一_pygame
学习Python如果一直在啃语法书,那样学一阵子就会没劲了,总得找点成就感吧。
之前的爬虫小程序就是一个很好的示范,我们可以快速得到正反馈。
因此学习Python的时候,要找准一个应用方向,不断地建立小案例,积累小知识,这样学习就越来越有乐趣。
这段时间我想研究一下Python在游戏制作方面的应用。
主要目标是实现像微信中“打飞机游戏”的功能,参考文章:
http://www.cnblogs.com/wuzhanpeng/p/4261015.html
一、环境配置
我已经安装了Python2.7,现在还需要安装pygame库。pygame库是Python游戏制作的库。
官网:
http://www.pygame.org/download.shtml
下载之后,安装一下就可以了。
注意:
1. pygame版本要与Python版本配合,下载链接上有标明。
2. 官网上没有64位版本,如果需要64位版本,请百度“pygame 64位”。
二、pygame的模块说明
pygame的模块很多,例如:
pygame,顶级模块
pygame.locals,pygame的常量定义
pygame.display,pygame的显示表面(surface)
pygame.event,pygame的事件
不一一描述,在用到哪个模块时再详细解说。参考在线文档:http://www.pygame.org/docs/
三、第一个程序
源代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import pygame
from sys import exit
SCREEN_WIDTH = 480 # 屏幕宽度
SCREEN_HEIGHT = 640 # 屏幕高度
# pygame.init()将会初始化所有导入的pygame模块
pygame.init()
# set_mode()函数将会创建一个显示面板(surface),即游戏窗口
# 参数一为surface的分辨率,即窗口的大小
# 参数二为surface的显示模式
# 参数三为surface的位深
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
# set_caption()函数设置窗口的标题
pygame.display.set_caption('飞机游戏')
# 载入图片
bg = pygame.image.load('bg1.jpg')
while True:
# 在surface上绘图,参数一是图像,参数二是左上角的位置
screen.blit(bg, [0, 0])
# 更新屏幕
pygame.display.update()
# pygame.event.get()方法可以从事件队列得到所有事件的列表
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
1. 导入库
导入pygame库,还用到了sys库中的exit()函数,这时可以使用语法:from sys import exit,单独导入exit函数。
2. 初始化pygame
pygame模块中的init()函数将会初始化所有导入的pygame模块。
3. 创建surface
“surface”概念相当于是windows编程中的窗口概念。使用pygame.display模块中的set_mode()函数可以生成一个surface。
set_mode()函数有三个参数:
(1) 窗口的大小,例如:[480, 640]。
(2) 窗口的显示模式:
pygame.FULLSCREEN:全屏
pygame.HWSURFACE:硬件加速
pygame.OPENGL:使用OPENGL
pygame.DOUBLEBUF:双缓冲,只能在硬件加速和OPENGL中使用
pygame.RESIZABLE:可以改变大小
pygame.NOFRAME:无边框
可以组合使用这些常量,用“|”连接。
(3) 位深,即用多少位来表现颜色。
4. 游戏主循环
任何游戏都应创建一个不间断的循环,称为游戏主循环。
在游戏主循环中,主要做三件事:
(1) 更新界面显示
(2) 处理用户事件
(3) 程序逻辑处理
例如在《帝国时代2》游戏中,每一次循环,“处理用户事件”就是处理用户的鼠标点击或键盘上的按键,“程序逻辑处理”就是判断士兵攻击敌人或被敌人攻击时怎么扣血,“更新界面显示”就是根据物体的状态重新绘制游戏界面,例如建筑快被打爆时显示燃烧的火焰。
5. 在surface上绘图
首先,通过bg = pygame.image.load('bg1.jpg')载入图片。应把图片和Python文件放在一个目录中,如果图片在子目录中,则需使用相对路径。
然后,在游戏主循环中,调用surface.blit()方法可以在surface上绘图:screen.blit(bg, [0, 0]),绘图时参数一为图像,参数二为左上角坐标。
最后,调用pygame.display模块的update()函数刷新界面。
6. 事件处理
调用pygame.event模块的get()函数,可以得到事件队列中的事件列表,对事件列表进行遍历,如果恰好是退出事件,则退出程序。
至此,我们实现了游戏窗口的创建,还在游戏窗口中绘制了背景图案,还实现了点击窗口右上方的“X”退出游戏的功能。