Python(白银时代)——pygame 游戏开发

Posted 程序猿知秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python(白银时代)——pygame 游戏开发相关的知识,希望对你有一定的参考价值。

pygame 基本介绍与使用

介绍

  • pygame 就是一个Python 模块,专为电子游戏设计

  • 官方网站:www.pygame.org

  • Pygame 是一个高可移植性的模块可以支持多个操作系统

安装

  • 在命令窗口输入:pip3 install pygame

  • 验证安装成功,在命令窗口输入:python -m pygame.examples.aliens

游戏的初始化与退出

  • 要使用 pygame 提供所有功能之前,需要调用 init 方法

  • 在游戏结束时,需要调用 quit 方法,卸载所有pygame模块

方法说明
pygame.init()导入并初始化所有pygame模块,使用其它模块之前,必须先调用 init 方法
pygame.quit()卸载所有pygame模块,在游戏结束前调用

游戏中的坐标系

  • 原点  指游戏窗口的左上角 ,坐标是 0,0

  • x轴  水平方向向右,逐渐增加

  • y轴  垂直方向向下,逐渐增加

  • 在游戏中,所有可见的元素都是以 矩形区域 来描述位置的

    • 描述一个矩形区域有四个要素:x、y、width、height

  • pygame 专门提供了一个类 pygame.Rect 用于描述 矩形区域

  • pygame.Rect 是一个比较特殊的类,内部只是封装了一些数字计算,不执行pygame.init() 方法同样能够使用

示例

import pygame
# 定义一个英雄的矩形,参数:x轴,y轴,宽,高
hero_rect=pygame.Rect(100,300,120,50)
print("英雄的原点是:%d,%d"%(hero_rect.x,hero_rect.y))
print("英雄的宽高是:%d,%d"%(hero_rect.width,hero_rect.height))

创建游戏主窗口

  • pygame 专门提供了一个模块 pygame.display 用于创建和管理游戏窗口

方法说明

pygame.display.set_mode

(resolution=(0,0),flags=0,depth=0)

初始化游戏显示窗口

参数:

resolution: 指定屏幕的宽和高,默认创建的窗口大小和屏幕大小一致

flags:指定屏幕的附加选项,例如是否全屏等,默认不需要传递

depth:表示颜色的位数,默认自动匹配

pygame.display.update()刷新屏幕内容显示
  • 像绘制

    • 使用 pygame.image.load() 加载图像的数据

    • 使用 游戏屏幕 对象,调用 blit() 方法,将图像绘制到指定位置

    • 调用 pygame.update() 方法更新整个屏幕显示

示例

pygame.init()
# 创建游戏的主窗口,只指定宽和高
screen=pygame.display.set_mode((512,768))

# 加载图像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上绘制图像
screen.blit(bg,(0,0))
# 更新屏幕显示
pygame.display.update()

游戏中的动画原理

  • 动画的本质就是 快速 的在屏幕上绘制 图像

  • 电影是将多张 静止的电影胶片 连续、快速的播放,产生连贯的视觉效果

  • 一般在电脑上 每秒绘制60次,就能够达到非常连续、高品质的动画效果

    • 每次绘制的结果被称为 帧Frame

  • 游戏时钟

    • pygame 专门提供了一个类 pygame.time.Clock 可以非常方便的设置屏幕绘制速度(刷新频率)

    • 在游戏初始化 创建一个 时钟对象

    • 在游戏循环中,让时钟对象调用 tick(帧率) 方法

    • tick 方法会根据 上次被调用的时间,自动设置 游戏循环 中的延时

示例

# 创建游戏时钟
clock=pygame.time.Clock()

while True:
    # 设置每秒刷新60次
    clock.tick(60)

游戏的事件与监听(event)

  • 事件:就是游戏启动后,用户针对游戏所做的操作 (例如:点击关闭按钮)

    • pygame 中通过 pygame.event.get() 可以获取 用户当前所做的动作 的事件列表

    • 这段代码非常的固定,几乎所有的 pygame 游戏都大同小异

  • 监听:在游戏循环中,判断用户的 具体操作

示例

while True:
    # 设置每秒刷新60次
    clock.tick(60)

    # 监听用户点击关闭按钮
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            
            # 退出系统
            exit()

pygame 高级使用

精灵与精灵组

  • 精灵(pygame.sprite.Sprite)

    • 在游戏开发中,通过把 显示图像的对象 叫做精灵

    • 精灵有两个重要的属性

      • image:记录图像数据

      • rect:记录在屏幕上的位置

    • update(*args):更新精灵的位置

    • kill():从所有组中删除

    • Sprite 并没有提供 image 和 rect 两个属性

      • 需要程序员从 pygame.sprite.Sprite 派生子类

      • 并在子类的初始化方法中设置 image和rect属性

  • 精灵组(pygame.sprite.Group)

    • 一个精灵组可以包含多个精灵对象

    • 调用精灵组对象的 update方法 会自动调用组内每个精灵的 update方法

    • 调用精灵组的 draw(屏幕对象)方法,可以将组内每一个精灵的image 绘制在 rect 位置

    • 注:仍需要调用 pygame.display.update() 才能在屏幕上看到最终结果

示例

plane_sprites.py 模块(定义派生精灵子类)

import pygame

# 自定义派生精灵子类,继承pygame.sprite.Sprite
class GameSprites(pygame.sprite.Sprite):
    """游戏精灵基类"""

    def __init__(self,img_name,speed=1):
        # 调用父类的初始化方法
        super().__init__()

        # 加载图像
        self.image=pygame.image.load(img_name)
        # 设置尺寸; get_rect()可以获取图像的原始大小
        self.rect=self.image.get_rect()
        # 设置速度
        self.speed=speed

    def update(self):
        # 默认在屏幕上垂直方向移动
        self.rect.y+=self.speed
 

main.py

from plane_sprites import *

pygame.init()
# 创建游戏的主窗口,只指定宽和高
screen=pygame.display.set_mode((512,768))
# 加载图像
bg=pygame.image.load("./img/bg1.jpg")
# 在屏幕上绘制图像
screen.blit(bg,(0,0))

# 定义英雄飞机
hero_img=pygame.image.load("./img/hero.png")
screen.blit(hero_img,(200,500))

# 创建游戏时钟
clock=pygame.time.Clock()
hero_rect=pygame.Rect(200,500,120,79)

# 创建敌机的精灵
enemy1=GameSprites("./img/enemy1.png")
enemy2=GameSprites("./img/enemy1.png",2)
# 将精灵放入精灵组
enemy_group=pygame.sprite.Group(enemy1,enemy2)


while True:
    # 设置每秒刷新60次
    clock.tick(60)
    hero_rect.y-=1

    if hero_rect.bottom <= 0:
        hero_rect.top = 768

    screen.blit(bg,(0,0))
    screen.blit(hero_img,hero_rect)

    # 精灵组调用两个方法,更新位置和在屏幕上绘制精灵
    enemy_group.update()
    enemy_group.draw(screen)

    pygame.display.update()

    # 监听用户点击关闭按钮
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

            # 退出系统
            exit()

定时器

  • pygame中可以使用 pygame.time.set_timer() 来添加定时器

  • 定时器:就是每隔一段时间,去执行一些动作

  • set_timer 可以创建一个事件

  • 可以在游戏循环的 事件监听中捕获到该事件

  • 定时器的监听

    • 通过 pygame.event.get() 可以获取当前时刻所有的事件列表

    • 遍历列表 并且判断 event.type 是否等于 eventid,如果相等,表示定时器事件 发生

语法

"""
第1个参数 事件代号 需要基于常量 pygame.USEREVENT 来指定,
USEREVENT 是一个整数,再增加的事件可以使用 USEREVENT+1 指定,依次类推.

第2个参数是 事件触发 间隔的毫秒值.
""" 
set_timer(eventid,milliseconds) ——>None

示例

键盘按键捕

  • 在 pygame 中针对键盘按键的捕获有 两种方式

  • 方式1:通过 event.type == pygame.KEYDOWN

  • 方式2:通过 pygame.key.get_pressed() 返回 所有按键元组,通过键盘常量,判断元组中 某一个键是否被按下 ——如果被按下,对应数值为 1(注:此种方式可以应对 长时间按住某个键)

第一种方式语法

if event.type== pygame.KEYDOWN and event.key==pygame.K_RIGHT:
  print("向右移动...")

第二种方式语法

# 返回所有按键的元组,如果某个按键按下,对应的值是1
keys_pressed=pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
  print("向右移动...")

碰撞检测

  • pygame 提供了两个非常方便的方法,可以实现碰撞检测

  • 方法一:pygame.sprite.groupcollide()

    • 检测两个精灵组中 所有的精灵 的碰撞检测

    • groupcollide(group1,group2,dokill1,dokill2,collided=None)——> Dict[Sprite, Sprite]
    • 如果将dokill 设置为 True,则发生碰撞的精灵将被自动移除

    • collided 参数用于 计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个 rect 属性

  • 方法二:pygame.sprite.spritecollide()

    • 检测 某个精灵 和指定精灵组 中的精灵的碰撞

    • spritecollide(sprite,group,dokill,collided=None)——>  List[Sprite]
    • 如果将 dokill 设置为 True,则指定精灵组中发生碰撞的精灵将自动被移除

    • collided 码数用于 计算碰撞的回调函数,如果没有指定,则每个精灵必须有一个 rect 属性

    • 返回 精灵组 中跟精灵 发生碰撞的 精灵列表          

绘制字体

  • 在 pygame 中有三个步骤

    • 步骤1:使用 pygame.font.Font 方法初始化字体

    • 步骤2:使用 font.render(内容, 布尔值,是否开启抗锯齿, 字体颜色,字体背景(不填,默认是透明))

    • 步骤3:使用 屏幕对象.blit(字体对象,位置)

示例:

# 第一个参数是字体名,第二个大小
# 字体文件可以在自己的系统中查找,然后拷贝到 代码同级目录下即可。
# 字体文件路径,以下以win7为例:C:\\Windows\\Fonts\\微软雅黑
my_font =  pygame.font.Font("msyh.ttf",58)

# 第一个参数是写的文字;
# 第二个参数是个布尔值,以为这是否开启抗锯齿,就是说True的话字体会比较平滑,不过相应的速度有一点点影响;
# 第三个参数是字体的颜色;
# 第四个参数是背景色,如果你想没有背景色(也就是透明),那么可以不加这第四个参数。
ext_surface = my_font.render("Pygame Score! ", True, (0,0,0), (255, 255, 255))

# 在屏幕上绘制字体,第一个参数是字体对象,第二个参数是x,y轴的位置
screen.blit(text_surface, (0, 0))
# 刷新屏幕
pygame.display.update()

播放音

  • 在 pygame 中用 pygame.mixer模块 来播放音乐,其中播放音乐有两种方式

  • 方式一: pygame.mixer.music.load(音频文件名)

    • 可以播放OGG、WAV、mp3 等格式音频

    • 适用音乐文件比较大,时长比较长的音乐,比如背景音乐

  • 方式二: pygame.mixer.Sound(音频文件名)

    • 可以播放OGG、WAV、mp3 等格式音频

    • 这种方式一般是用来加载一些比较短的声音,比如一些音效

示例

# 方式一 ,加载背景音乐
pygame.mixer.music.load("./music/bg.mp3")   # 加载背景音乐
pygame.mixer.music.set_volume(0.5)          # 设置音量,音量值在 0~1 区间
pygame.mixer.music.play(-1)                 # 播放音乐,参数是一个正整数,表示具体循环次数, -1 则表示无限循环

# 方式二 ,加载短音效,如 爆炸,发射子弹等
boomMusic = pygame.mixer.Sound("./music/boom.mp3") # 加载背景音乐
boomMusic.set_volume(0.3) # 设置音量,音量值在 0~1 区间
boomMusic.play()   # 播放音乐,参数是一个正整数,表示具体循环次数, 不填写,默认是一次

程序猿与投资生活实录已改名为  程序猿知秋,WX同款,欢迎关注! 

Python和Pygame游戏开发 pdf

 Python和Pygame游戏开发

目录 

第1章 安装Python和Pygame 1
1.1 预备知识 1
1.2 下载和安装Python 1
1.3 Windows下的安装说明 1
1.4 Mac OS X上的安装说明 2
1.5 Ubuntu和Linux上的安装
说明 2
1.6 启动Python 2
1.7 安装Pygame 3
1.8 如何阅读本书 4
1.9 特色的程序 4
1.10 下载图形文件和声音文件 4
1.11 行号和空格 4
1.12 图书中的文本折行 5
1.13 在线检查代码 5
1.14 配套网站上的更多信息 6

第2章 Pygame基础知识 7
2.1 GUI vs. CLI 7
2.2 使用Pygame的Hello World程序
源代码 7
2.3 建立一个Pygame程序 8
2.4 游戏循环和游戏状态 10
2.5 pygame.event.Event对象 11
2.6 QUIT事件和pygame.quit()
函数 12
2.7 像素坐标 13
2.8 关于函数、方法、构造函数和
模块中的函数(及其差别)的
一些提示 13
2.9 Surface对象和窗口 14
2.10 颜色 15
2.11 颜色的透明度 16
2.12 pygame.Color对象 17
2.13 Rect对象 17
2.14 基本的绘制函数 19
2.15 pygame.PixelArray对象 22
2.16 pygame.display.update()函数 22
2.17 动画 22
2.18 帧速率和pygame.time.Clock
对象 25
2.19 用pygame.image.load()和blit()
绘制图像 26
2.20 字体 26
2.21 抗锯齿 28
2.22 播放声音 28
2.23 本章小结 29

第3章 Memory Puzzle游戏 31
3.1 如何玩Memory Puzzle游戏 31
3.2 嵌套的for循环 31
3.3 Memory Puzzle的源代码 33
3.4 声明和导入 40
3.5 幻数很糟糕 40
3.6 使用assert语句全面检查 41
3.7 判断一个数字是偶数还是奇数 42
3.8 较早崩溃和经常崩溃 42
3.9 让源代码更好看一些 43
3.10 使用常量变量而不是字符串 44
3.11 确保有足够的图标 44
3.12 元组vs.列表,不可变vs.可变 45
3.13 单项元组需要一个结尾的逗号 46
3.14 在列表和元组之间转换 46
3.15 global语句以及为什么全局变量
是罪恶的 47
3.16 数据结构和2D列表 48
3.17 “开始游戏”动画 49
3.18 游戏循环 50
3.19 事件处理循环 50
3.20 检查鼠标光标在哪一个方块
之上 51
3.21 处理次点击的方块 52
3.22 处理不一致的一对图标 53
3.23 处理玩家获胜 53
3.24 将游戏状态绘制到屏幕 54
3.25 创建“揭开的方块”数据结构 55
3.26 创建游戏板数据结构:第1步—获取所有可能的图标 55
3.27 第2步—打乱并截取所有图标
的列表 56
3.28 第3步—将图标放置到游戏
板上 56
3.29 将一个列表分割为列表的
列表 57
3.30 不同的坐标系 58
3.31 从像素坐标转换为方块坐标 59
3.32 绘制图标以及语法糖 59
3.33 获取游戏板控件的图标的形状和
颜色的语法糖 61
3.34 绘制盖住的方块 61
3.35 处理揭开和覆盖动画 62
3.36 绘制整个游戏板 63
3.37 绘制高亮边框 63
3.38 “开始游戏”动画 64
3.39 揭开和盖住成组的方块 64
3.40 “游戏获胜”动画 65
3.41 判断玩家是否已经获胜 65
3.42 为何要那么麻烦地使用main()
函数 66
3.43 为什么要为可读性操心 67
3.44 本章小结 71

第4章 Slide Puzzle 72
4.1 如何玩Slide Puzzle 72
4.2 Slide Puzzle的源代码 72
4.3 款游戏和款相同 80
4.4 设置按钮 81
4.5 使用愚笨的代码变聪明 83
4.6 主游戏循环 83
4.7 点击按钮 84
4.8 用鼠标滑动贴片 85
4.9 用键盘滑动贴片 85
4.10 使用in操作符实现“等于其中
之一”的技巧 86
4.11 WASD和箭头按键 86
4.12 实际执行贴片滑动 87
4.13 IDLE和终止Pygame程序 87
4.14 检查特定的事件并且将事件添加
到Pygame的事件队列 88
4.15 创建游戏板数据结构 89
4.16 不记录空白的位置 89
4.17 通过更新游戏板数据结构来
移动 90
4.18 何时不使用断言 90
4.19 获取一次并不是那么随机的
移动 91
4.20 将贴片坐标转换为像素坐标 92
4.21 将像素坐标转换为游戏板坐标 92
4.22 绘制一个贴片 93
4.23 让文本显示在屏幕上 93
4.24 绘制游戏板 94
4.25 绘制游戏板的边框 94
4.26 绘制按钮 95
4.27 实现贴片滑动动画 95
4.28 Surface的copy()方法 96
4.29 创建新的谜题 98
4.30 实现游戏板重置动画 99
4.31 时间vs.内存的权衡 100
4.32 没人在乎几个字节 101
4.33 没人在乎几百万个纳秒 101
4.34 本章小结 101

第5章 Simulate 102
5.1 如何玩Simulate游戏 102
5.2 Simulate的源代码 102
5.3 常用初始内容 108
5.4 设置按钮 109
5.5 main()函数 110
5.6 程序中用到的一些局部变量 110
5.7 绘制游戏板并处理输入 111
5.8 检查鼠标点击 112
5.9 检查键盘按下 112
5.10 游戏循环的两种状态 113
5.11 搞清楚玩家是否按下了正确的
按钮 113
5.12 新纪元时间 115
5.13 将游戏板绘制到屏幕 116
5.14 相同的旧的terminate()函数 116
5.15 复用常量变量 117
5.16 实现按钮闪烁动画 117
5.17 绘制按钮 120
5.18 实现背景颜色改变的动画 120
5.19 游戏结束动画 121
5.20 将像素坐标转换为按钮 122
5.21 显式比隐式好 123

第6章 Wormy 125
6.1 Wormy游戏的玩法 125
6.2 Wormy的源代码 125
6.3 栅格 131
6.4 设置代码 131
6.5 main()函数 132
6.6 单独的runGame()函数 133
6.7 事件处理循环 134
6.8 碰撞检测 134
6.9 检测和苹果的碰撞 135
6.10 移动虫子 136
6.11 insert()列表方法 136
6.12 绘制屏幕 137
6.13 在屏幕上绘制“Press a key”
文本 137
6.14 checkForKeyPress()函数 137
6.15 初始屏幕 138
6.16 旋转初始屏幕文本 139
6.17 旋转并不 140
6.18 决定苹果出现在哪里 141
6.19 游戏结束屏幕 141
6.20 绘制函数 142
6.21 不要复用变量名 144

第7章 Tetromino 146
7.1 一些Tetromino术语 146
7.2 Tetromino的源代码 147
7.3 常用设置代码 159
7.4 设置按下键的定时常量 159
7.5 更多的设置代码 160
7.6 设置砖块模式 161
7.7 将“一行代码”分隔到多行 164
7.8 main()函数 165
7.9 开始新的游戏 166
7.10 游戏循环 167
7.11 事件处理循环 167
7.12 暂停游戏 167
7.13 使用移动变量来处理用户输入 168
7.14 检查移动或旋转是否有效 168
7.15 找到底部 171
7.16 通过按下按键来移动 172
7.17 让砖块“自然”落下 174
7.18 将所有内容绘制到屏幕上 175
7.19 制作文本的快捷函数
makeTextObjs() 176
7.20 相同的旧的terminate()函数 176
7.21 使用checkForKeyPress()函数等
待按键事件 176
7.22 通用文本屏幕函数
showTextScreen() 177
7.23 checkForQuit()函数 178
7.24 calculateLevelAndFallFreq()
函数 178
7.25 用函数getNewPiece()产生新的
砖块 180
7.26 给游戏板数据结构添加砖块 181
7.27 创建一个新的游戏板数据
结构 181
7.28 isOnBoard()和isValidPosition()
函数 182
7.29 检查、删除和填满一行 184
7.30 将游戏板坐标转换为像素坐标 186
7.31 在游戏板上或屏幕上的其他位置
绘制方块 187
7.32 将所有内容绘制到屏幕上 187
7.33 绘制得分和关卡文本 188
7.34 在游戏板上或屏幕的其他位置
绘制一个砖块 188
7.35 绘制“Next”砖块 189
7.36 本章小结 189

第8章 Squirrel Eat Squirrel 191
8.1 如何玩Squirrel Eat Squirrel 191
8.2 Squirrel Eat Squirrel的设计 191
8.3 Squirrel Eat Squirrel的源代码 192
8.4 常用设置代码 202
8.5 描述数据结构 203
8.6 main()函数 204
8.7 pygame.transform.flip()函数 205
8.8 更为详细的游戏状态 205
8.9 常用的文本创建代码 206
8.10 相机 206
8.11 “活动区域” 208
8.12 记录游戏世界中的物体的位置 208
8.13 从一些草开始 209
8.14 游戏循环 209
8.15 检查去掉保护状态 209
8.16 移动敌人松鼠 210
8.17 删除较远的草对象和松鼠
对象 211
8.18 当从列表中删除项的时候,
反向遍历列表 211
8.19 添加新的草对象和松鼠对象 213
8.20 相机延迟以及移动相机视图 213
8.21 绘制背景、草、松鼠和生命值
指示 214
8.22 事件处理循环 216
8.23 移动玩家并考虑跳动 218
8.24 碰撞检测:吃或被吃 219
8.25 游戏结束屏幕 221
8.26 获胜 221
8.27 绘制图形化的生命值指标 221
8.28 相同的旧的terminate()函数 222
8.29 正弦函数 222
8.30 对Python 2的向后兼容 225
8.31 getRandomVelocity()函数 226
8.32 找到一个地方添加新的松鼠
和草 226
8.33 创建敌人松鼠数据结构 228
8.34 翻转松鼠图像 228
8.35 创建草数据结构 229
8.36 检查是否在活动区域之外 229
8.37 本章小结 230

第9章 Star Pusher 231
9.1 如何玩Star Pusher 231
9.2 Star Pusher的源代码 232
9.3 初始化设置 245
9.4 Star Pusher中的数据结构 259
9.5 读取和写入文本文件 260
9.6 递归函数 268
9.7 栈溢出 269
9.8 使用基本条件防止栈溢出 271
9.9 漫水填充算法 271
9.10 绘制地图 273
9.11 检查关卡是否完成 275
9.12 本章小结 276

第10章 4款其他游戏 277
10.1 Flippy,Othello的翻版 277
10.2 Flippy的源代码 279
10.3 Ink Spill,Flood It游戏的
翻版 291
10.4 Ink Spill的源代码 292
10.5 Four-In-A-Row,Connect Four
的翻版 303
10.6 Four-In-A-Row的源代码 304
10.7 Gemgem,Bejeweled的翻版 312
10.8 Gemgem的源代码 313
10.9 本章小结 326

术语表 328

 

下载地址:https://pan.baidu.com/s/17i0-_USHUjEgRaY7DHe9yw

关注微信公众号获取提取码:

  输入:pypg   获取提取码  

 
 

以上是关于Python(白银时代)——pygame 游戏开发的主要内容,如果未能解决你的问题,请参考以下文章

Python和Pygame游戏开发 pdf

Python游戏开发,pygame模块,Python实现五子棋联机对战小游戏

Python游戏开发,pygame模块,Python实现过迷宫小游戏

Python游戏开发,pygame模块,Python实现经典90坦克大战游戏

Python游戏开发,pygame模块,Python实现炸弹人小游戏

Python游戏开发,pygame模块,Python实现2048小游戏