在慕课上看的嵩天老师的Pygame的教学视频,并对第一个“壁球”小游戏做了以下的总结。
我想要学习Pygame的目的,是因为这个东西不仅学起来简单,而且还可以在短期内做出一些简单的成果。因此,我认为这是一个低付出,高回报的事情,所以就开始了Pygame的学习。嵩天老师还说了这么一句话:无论学习什么专业,从事什么工作,在世界的哪里坚守着,即使我们不能仗剑天涯,即使要面对眼前的苟且,请学习Pygame,用技术让自己的心灵来趟诗和远方的旅行吧。
下面的代码有很多重复的地方,但是为了保证代码的完整性,易读懂,我就把代码全粘了下来。
Pygame简介与安装
Pygame安装
安装好Python之后。
打开cmd,输入指令pip install pygame
Pygame简介
- 学习游戏开发入门的最好的第三方库
- Pygame是一款游戏开发的引擎,基本逻辑具有极大的参考价值。
- Pygame是Python最经典的2D游戏开发第三方库,也支持3D游戏等相关功能的开发。
- Pygame适用于游戏逻辑验证、游戏入门及系统演示验证。也有着系统的演示和仿真的功能(功能性的系统),不一定是游戏。
Pygame最小开发框架及最小游戏
有最小开发框架,极简开发框架两种框架。
计算机不断地获取用户输入的事件,并逐类响应。根据相应刷新屏幕,保证响应让用户看到。
代码如下
# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。
# 初始化
pygame.init() # dui Pygame每部各功能模块进行初始化创建及变量设置,默认调用
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() # 刷新屏幕
壁球小游戏(展示型)与图像的基本使用
从需求倒是显得三个关键要素:
(1)壁球:游戏需要一个壁球,通过图片引入;
(2)壁球运动:壁球要能够上下左右四个方向运动;
(3)当壁球碰到上下左右边缘的时候,要能够反弹。
壁球的图片链接位:https://python123.io/PY15/PYG02-ball.gif
代码如下
# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。
# 初始化
pygame.init()
size = width, height = 600, 400 # 窗体的大小
speed = [1, 1] # 速度为1像素
BLACK = 0, 0, 0 # RGB颜色为黑色
screen = pygame.display.set_mode( size ) # 设置窗体大小
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("ball.gif")
ballrect = ball.get_rect()
# pygame.image.load(filename)将filename路径下的图像载入游戏,支持JPG、PNG、GIF(非动画)等13种常用图片格式
# Surface对象 Pygame使用内部定义的Surface对象表示所有载入的图像,其中.get_rect()方法返回一个与图像外切的图形Rect对象
# Rect对象 有一些重要属性,例如:top,bottom,left,right表示上下左右;width,height表示宽度高度
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 ) # 将一个图像绘制在另一个图像上,即将ball会知道ballrect位置上,通过Rect对象引导对壁球绘制
pygame.display.update() # 窗口刷新
图像的处理操作
- pygame.image.load(filename)将filename路径下的图像载入游戏,支持JPG、PNG、GIF(非动画)等13种常用图片格式
- Surface对象 Pygame使用内部定义的Surface对象表示所有载入的图像,其中.get_rect()方法返回一个与图像外切的图形Rect对象
- Rect对象 有一些重要属性,例如:top,bottom,left,right表示上下左右;width,height表示宽度高度
- 系统默认,图层移动之后,原来的位置将会被填充白色。因此,每一次都需要不断刷新背景色
- 将一个图像绘制在另一个图像上,即将ball会知道ballrect位置上,通过Rect对象引导对壁球绘制
壁球小游戏(节奏型)与屏幕的帧率设置
需求:壁球可以按照一定速度运动
如何实现控制壁球的运动速度?可以通过控制循环的间隔
代码如下
# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。
# 初始化
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("ball.gif")
ballrect = ball.get_rect()
fps = 500 # Frames per Seconds,每秒钟帧数
fclock = pygame.time.Clock() # pygame.time.Clock() 创建一个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()
fclock.tick(fps)
帧率控制操作
- fclock = pygame.time.Clock() 创建一个Clock对象,用于操作时间
- fclock.tick(fps),控制帧速度,即窗口刷新的速度。例:clock.tick(100)表示每秒钟昂100次帧刷新。
壁球小游戏(操控型)与键盘的基本使用
需求:壁球可以通过键盘控制运动速度
每触发一次时间,速度改变的大小为1个像素。
按键盘上的“↑”方向键,纵向绝对速度的增加;
按“↓”,纵向绝对速度的减少;
按“→”,横向绝对速度的增加;
按“←”,横向绝对速度的减少。
如何实现通过键盘控制壁球的运动速度?可以通过控制循环的间隔
代码如下
# 引用
import pygame,sys # sys是Python的标准库,提供Python运行时环境变量的操控。
# 初始化
pygame.init()
size = width, height = 1000, 700
speed = [5, 5]
BLACK = 0, 0, 0
screen = pygame.display.set_mode( size )
pygame.display.set_caption("Pygame壁球")
ball = pygame.image.load("E:\Picture\Photo\Pygame\\ball.gif")
ballrect = ball.get_rect()
fps = 50 # Frames per Seconds,每秒钟帧数
fclock = pygame.time.Clock() # pygame.time.Clock() 创建一个Clock对象,用于操作时间
while True:
# 事件处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
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[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()
fclock.tick(fps)
键盘控制操作
- pygame.KEYDOWN Pygame对键盘敲击的事件定义,键盘每个键对应一个具体定义:
- ↑:pygame.K_UP
- ↓:pygame.K_LEFT
- ←:pygame.K_DOWN
- →:pygame.K_RIGHT