1、Pygame库简介与安装:
- Pygame库简介
Pygame是Python最经典的2D游戏开发第三方库,也支持3D游戏开发。
Pygame适合用于游戏逻辑验证、游戏入门及系统演示验证,因此可以说Pygame的使用还是相当广泛的。
Pygame是一种游戏开发引擎,基本逻辑具有参考价值
- Pygame库安装
使用pip install pygame
命令安装即可。
在cmd中执行python -m pygame.examples.aliens
命令,可以运行一个系统提供的小游戏。
2、Pygame最小开发框架:
如下代码是Pygame最小开发框架:
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame游戏之旅")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
运行后出现一个如下窗口,没有任何功能,只是在窗口左上角显示了Pygame游戏之旅
文字:
这就是Pygame最小开发框架,也反应了游戏开发中的基本逻辑框架,最小开发框架包括了以下四个部分:
- 引入Pygame和sys
# sys是Python的标准库
# sys提供Python运行时环境变量的操控
# sys.exit()用于结束游戏并推出
import pygame,sys
- 初始化init()及设置
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("Pygame游戏之旅")
pygame.init()
——对pygame内部各功能模块进行初始化创建及变量设置,默认调用。
pygame.display.set_mode(size)
——初始化显示窗口,第一个参数size是一个二值元祖,分别表示窗口的宽度和高度。
pygame.display.set_caption(title)
——设置显示窗口的标题内容,参数title是一个字符串类型。
- 获取事件并逐类响应
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
while True:
——无限循环,直到Python运行时推出结束。pygame.event.get()
——从Pygame的事件队列中取出事件,并从队列中删除该事件,例如:键盘按下是一个事件。event.type
pygame.QUIT
——获得事件类型,并逐类响应;pygame.QUIT是Pygame中定义的退出事件常量。
- 刷新屏幕
# 对显示窗口进行更新,默认窗口全部重绘
pygame.display.update()
3、壁球小游戏(展示型)与图像的基本使用:
从需求到实现的三个关键要素:
(1)壁球:游戏需要一个壁球,通过图片引入。
(2)壁球运动:壁球要能够上下左右运动。
(3)壁球反弹:壁球要能够再上下左右边缘反弹。
# 引用
import pygame, sys
# 初始化
pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
# ygame.image.load(filename)将filename路径下的图像载入游戏,支持jpg、png、gif等13种常用图片格式
ball = pygame.image.load("PYG02-ball.gif")
# Surface对象 ball.get_rect()
# Pygame使用内部定义的Surface对象表示所有载入的图像,其中.get_rect()方法返回一个覆盖图像的矩形Rect对象
# Rect对有一些重要属性,例如:top、bottom、left、right表示其上下左右坐标值,width、height表示宽度、高度
ballrect = ball.get_rect()
# 事件处理
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# ballrect.move(x,y)表示矩形移动一个偏移量(x,y),即在横轴方向移动x像素,纵轴方向移动y像素,xy为整数
ballrect = ballrect.move(speed[0], speed[1])
# 壁球的反弹运动,遇到左右两侧,横向速度取反;遇到上下两侧,纵向速度取反
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)显示窗口背景填充为color颜色,采用RGB色彩体系。由于壁球不断运动,运动后原有位置将默认填充为白色,因此需要不断刷新背景色
screen.fill(BLACK)
# screen.blit(src,dest)将一个图像绘制在另一个图像上,即将src绘制到dest位置上,通过Rect对象引导对壁球的绘制,也就是让图像跟着矩形的移动而移动
screen.blit(ball, ballrect)
pygame.display.update()
运行代码将得到如下窗口显示,但是此时壁球运动速度很快,看的不是很清楚。
4、壁球小游戏(节奏型)与屏幕的帧数设置:
需求:壁球可以按照一定速度运动。
实现的关键要素:如何控制壁球的运动速度。
import pygame, sys
pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
# 每秒帧数参数
fps = 300
# pygame.time.Clock()创建一个Clock对象,用于操作时间
fclock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
ballrect = ballrect.move(speed[0], speed[1])
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(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
# clock.tick(framerate)是Clock对象的一个方法,控制帧速度,即窗口刷新速度,例如,clock.tick(100)表示每秒100次帧刷新,视频中每次展示的静态图像称为帧
fclock.tick(fps)
运行代码将看到此时壁球运动速度放慢了,但是我们此时是不能操作壁球运动的。
5、壁球小游戏(操控型)与键盘的基本使用:
壁球小游戏(操控型)设置:
(1)方向键↑:纵向绝对速度增加1个像素(纵向加速)。
(2)方向键↓:纵向绝对速度减少1个像素(纵向减速)。
(3)方向键←:横向绝对速度减少1个像素(横向减速)。
(4)方向键→:纵向绝对速度增加1个像素(横向加速)。
壁球小游戏(操控型)解决问题:
(1)键盘使用:如何获取键盘的操作事件。
(2)速度调节:根据对应按键调节壁球运动速度。
import pygame, sys
pygame.init()
size = width, height = 600, 400
speed = [1, 1]
BLACK = 0, 0, 0
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("PYG02-ball.gif")
ballrect = ball.get_rect()
fps = 300
fclock = pygame.time.Clock()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# pygame.KEYDOWN是Pygame对键盘敲击事件定义,键盘吗,每个键对应一个具体定义
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
speed[0] = speed[0] if speed[0] == 0 else (abs(speed[0]) - 1) * int(speed[0] / abs(speed[0]))
elif event.key == pygame.K_RIGHT:
speed[0] = speed[0] + 1 if speed[0] > 0 else speed[0] - 1
elif event.key == pygame.K_UP:
speed[1] = speed[1] + 1 if speed[1] > 0 else speed[1] - 1
elif event.key == pygame.K_DOWN:
speed[1] = speed[1] if speed[1] == 0 else (abs(speed[1]) - 1) * int(speed[1] / abs(speed[1]))
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(BLACK)
screen.blit(ball, ballrect)
pygame.display.update()
fclock.tick(fps)
运行代码后将可以通过键盘上下左右键来控制壁球运动。