Python游戏开发(一)

python游戏开发框架

pygame最小开发框架

pygame的简介与安装

  1. pygame
    是利用系统自带的SDL库进行封装得到的库
  2. 游戏示例
    在命令行输入 python -m pygame.examples.aliens
    就可以运行一个示例的游戏。
  3. 开发环境
    建议使用pycharm。
    4.pygame的使用
    有时用于游戏的卡法与验证,有时也用于其他系统的验证。
    pygame也是一种游戏开发引擎,是学习的入门工具。

pygame最小开发框架

包含四个部分:

  1. 引入第三方库

  2. 初始化init()以及设置(包括设置窗口大小,窗口名字)
    能对各种功能模块进行初始化创建并进行变量设置。
    pygame.display.set_mode((width, lenth)),用于初始化一个显示窗口,变量为一个二维元组,设置窗口的宽和高。
    pygame.display.set_caption("title"),用于对初始化的窗口进行命名。
    引入和初始化模块只进行一次。

  3. 进入一个循环,获取事件

    循环应该会无限循环下去,知道用户退出。
    pygame中所有的事件都会进入一个event队列,包括键盘的输入等。通过不断地从事件队队列中取出事件来对用户进行相应。for event in pygame.event.get()
    如果事件类型为QUIT类型,那么就应该调用sys.exit()进行退出。
    除了获得事件响应事件之后,还应该对窗口进行更新,否则用户无法认知是否进行了响应。

  4. 刷新屏幕
    游戏就是要不断地获取用户的输入,并不断输出,进行响应。

import sys, pygame
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()
  1. sys库的介绍
    sys是python的标准库,提供python运行时需要的相关环境和变量。
    sys.exit()用于结束游戏并退出。

壁球小游戏与图像的基本使用

从需求到实现的三个要素:

  1. 需要引入一个小球的图片。
  2. 壁球的运动:壁球需要能够上下左右四个方向进行运动。
  3. 壁球的反弹:壁球在碰到上下左右边缘时需要反弹。
import sys, pygame
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("滑稽球1.jpg")
ballrect = ball.get_rect()
# pygame对任意导入的图像都表示为surface对象,通过get_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])
# 通过move方法可以对矩形进行移动
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]
# 遇到上下边界则y方向速度取反,遇到左右边界则x方向速度取反
    screen.fill(Black)
# 显示窗口进行填充,因为移动后默认原本位置为白色,所以必须不断刷新背景,使用RGB色彩体系
    screen.blit(ball, ballrect)
# 实际的移动是通过不断把小球的图像绘制到对应的矩形框里面来完成的
    pygame.display.update()

壁球小游戏与屏幕的帧率设置

需求:壁球可以按照一定速度进行运动。不像之前那么快。
要素:如何有效控制壁球的速度呢?

引入了新的函数:

  1. pygame.time.Clock()
    这里创建一个时钟对象。可以通过操作时间对象来控制帧率。
    fps = 300;设置帧率
  2. clock.tick(fps)
    设置帧率,也即屏幕刷新频率,帧即每一张静止的动画。
    例如:clock.tick(100)就是指每秒刷新一百次

壁球小游戏的控制

需求:希望通过上下左右来控制小球的速度。
实现:↑增加一个像素的纵向速度,↓减少一个像素的纵向速度,左右同理。
键盘使用:如何获取键盘输入。
速度调节:根据对应按键来调节小球的速度。

在事件处理部分增加了键盘的敲击事件的响应。
pygame对键盘的敲击提供了对应的事件:
pygame.KEYDOWN,
pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT

pygame最小游戏最终代码

import sys, pygame
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壁球")
fps = 300
fclock = pygame.time.Clock()
ball = pygame.image.load("滑稽球1.jpg")
ballrect = ball.get_rect()
# pygame对任意导入的图像都表示为surface对象,通过get_rect()形成与对象紧密相关的矩形对象
# rect对象有一些重要属性,如top,bottom,left,right表示上下左右边的坐标width和height表示宽和高
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])
# 通过move方法可以对矩形进行移动
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]
# 遇到上下边界则y方向速度取反,遇到左右边界则x方向速度取反
    screen.fill(Black)
# 显示窗口进行填充,因为移动后默认原本位置为白色,所以必须不断刷新背景,使用RGB色彩体系
    screen.blit(ball, ballrect)
# 实际的移动是通过不断把小球的图像绘制到对应的矩形框里面来完成的
    pygame.display.update()
    fclock.tick(fps)

感觉这个游戏系列作为消遣还是很有意思的,哈哈哈哈。


以上内容来自北京理工大学嵩天老师及其团队的《Python游戏开发入门》课程第二周的内容。
非常感谢嵩天老师及其团队给我们带来这样优质的课程。

上一篇:20210514(4种方案详解如何实现准时的setTimeout)


下一篇:jQuery笔记