当前位置: 欣欣网 > 码农

Python升级之路( Lv25) PyGame游戏开发基础(下)

2024-03-01码农

Python系列文章目录

第二十五章 Pygame游戏开发基础(下)


  • Python系列文章目录

  • 前言

  • 什么是Pygame

  • 常用模块介绍

  • 事件操作

  • 字体处理

  • 绘制图形

  • 实现动画

  • 播放音乐


  • 前言

    大家好, 我是了不起, 欢迎收看我的冒险之旅

    今天我们将学习Pygame, 学习其常用模块, 丰富我们开发能力.

    今日冒险片段上

    在击败使徒之后, 所有被控制的人解除了控制, 可是奥菲利亚发现, 她的叔叔审判者马塞尔仍然没有找到. 作为地位仅次于奥菲利亚的人, 他的生死存亡也十分重要. 于是众人开始打听其下落, 某个被控制的老教徒说到, 在没有被控制之前, 他是追随马塞尔进入到天帷禁地的. 这个地方之所以被称为禁地的原因, 是因为其是在天帷巨兽的肚子里面. 因为天帷巨兽十分庞大, 因此肚子内的空间也极大. 审判者马塞尔藏匿与此, 是为了有朝一日能够积蓄力量, 然后一举击溃罗斯特.
    听到这里, 大家放松了一口气, 于是决定前往禁地, 来将这个好消息告诉马塞尔. 但当奥菲利亚当面将消息告诉审判者马塞尔时, 马塞尔的情绪由平静到激动, 再到低落, 然后变得癫狂. 仿佛失心疯一样咆哮着: 为了能够击败罗斯特, 我辛辛苦苦在这里卧薪尝胆地准备了五年! 结果却被你们几天打败了? 那谁来见证我的努力? 谁又来承受我失去家园的痛苦? 我不甘心啊! 于是, 马塞尔召集所属的信徒们向了不起他们发起攻击...

    什么是Pygame

    Pygame 是一组用于编写视频游戏的 Python 模块. 它具有高度的可移植性,几乎可以在所有平台和操作系统上运行. Pygame 在优秀的 SDL 库之上添加了功能. 这使我们可以使用 python 语言创建功能齐全的游戏和多媒体程序. 官网入口

    常用模块介绍

    事件操作

    Pygame 会接受用户的各种操作(比如按键盘,移动鼠标等). 这些操作会产生对应的事件,例如按键盘事件,移动鼠标事件. 事件在软件开发中非常重要,Pygame 把一系列的事件存放在一个队列里,并逐个进行处理

    1. 事件检索 使用函数 pygame.event.get()获取所有的事件,表 1-3 列出了 Pygame 中常用的事件

      事件 参数 产生途径
      QUIT none 用户按下关闭按钮
      ACTIVEEVENT gain, state 激活或者隐藏
      Pygame KEYDOWN unicode, key, mod 按下键
      KEYUP key, mod 放开键
      MOUSEMOTION pos, rel, buttons 鼠标移动
      MOUSEBUTTONUP pos, button 放开鼠标键
      MOUSEBUTTONDOWN pos, button 按下鼠标键
      JOYBUTTONUP joy, button 游戏手柄放开
      JOYBUTTONDOWN joy, button 游戏手柄按下
      VIDEORESIZE size, w, h Pygame 窗口缩放
      VIDEOEXPOSE none Pygame 窗口部分公开(expose)
      USEREVENT code 触发一个用户事件
    2. 处理鼠标事件 在 Pygame 框架中,MOUSEMOTION 事件会在鼠标动作的时候发生,它有如下所 示 3 个参数 buttons: 一个含有 3 个数字的元组,3 个值分别代表左键、中键和右键,1 就表示 按下. pos: 位置 ;
      rel: 代表现在距离上次产生鼠标事件时的距离.和MOUSEMOTION 类 似 , 常用的鼠标事件还有 MOUSEBUTTONUP 和 MOUSEBUTTONDOWN 两个

    3. 处理键盘事件 key :按下或者放开的键值,是一个数字,在 Pygame 中可以使用 K_xxx 来表示,比如字母 a 就是 K_a,还有 K_SPACE 和 K_RETURN 等 mod :包含了组合键信息,如果 mod&KMOD_CTRL 是真,表示用户同时按下了 Ctrl 键,类似的还有 KMODE_SHIFT 和 KMODE_ALT。 unicode :代表了按下键对应的 Unicode 值

    实操代码

    import pygame
    pygame.init()
    pygame.display.set_caption("处理键盘事件")
    screen = pygame.display.set_mode((600500), 032)
    # 加载图片
    image = pygame.image.load("img/1.gif") # 需要在当前包下面父类包下面创建文件夹
    # 设置x,y作为初始位置
    x, y = 00
    # 设置各个方向移动
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 退出(处理了框体右上角x)
    exit()
    if event.type == pygame.KEYDOWN: # 按下
    if event.key == pygame.K_LEFT:
    x -= 10
    elif event.key == pygame.K_RIGHT:
    x += 10
    elif event.key == pygame.K_UP:
    y -= 10
    elif event.key == pygame.K_DOWN:
    y += 10
    screen.fill((000)) # 设置背景颜色
    screen.blit(image, (x, y)) # 填充图像
    pygame.display.update() # 刷新屏幕

    效果展示

    字体处理

    在 Pygame 模块中可以直接调用系统字体,或者可以直接使用 TTF 字体.

    为了使用字体, 需要先创建一个 Font 对象:

    font = pygame.font.SysFont(‘arial’,18)

  • 在上述代码中,第一个参数是字体名,第二个参数表示大小。

  • 一般来说,「Arial」字体 在很多系统都是存在的,如果找不到,就会使用一个默认字体,这个默认字体和每个操作系统有关 也可以使用 pygame.font.get_fonts()函数来获取当前系统中所有可用的字体

  • 一旦创建了一个 font 对象,就可以通过如下代码使用 render 方法来写字,并且可以显 示到屏幕中.

  • COLOR_RED = pygame.Color(25500
    textSurface = font.render(‘Hello Pygame’,True,COLOR_RED)

  • 在上述代码中,第一个参数是写的文字, 第二个参数是布尔值,它控制是否开启抗锯齿功能,如果设置为 True 字体会比较平滑,不过相应的速度会有一点点影响;第三个参数是字体的颜色;第四个是背景色,如果你想没有背景色,那么可以不加第四个参数

  • 实操代码

    import pygame
    pygame.init()
    # 创建窗口
    screen = pygame.display.set_mode((600500), 032)
    pygame.display.set_caption("测试字体处理")
    # 设置字体样式
    font = pygame.font.SysFont("kaiti"20)
    # 设置字体颜色
    COLOR_RED = pygame.Color(25500)
    # 设置文本内容
    textSurface = font.render('你好世界'True, COLOR_RED)
    # 设置文本初始坐标
    x, y = 00
    # 设置各个方向移动
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 退出(处理了框体右上角x)
    exit()
    if event.type == pygame.KEYDOWN: # 按下
    if event.key == pygame.K_LEFT:
    x -= 10
    elif event.key == pygame.K_RIGHT:
    x += 10
    elif event.key == pygame.K_UP:
    y -= 10
    elif event.key == pygame.K_DOWN:
    y += 10
    screen.fill((000)) # 设置背景颜色
    screen.blit(textSurface, (x, y)) # 填充图像
    pygame.display.update() # 刷新屏幕

    绘制图形

    Pygame 的坐标原点(0,0)点位于左上角,X 轴自左向右,Y 轴自上向下,单位为像素

    绘制图形的方法下表

    方法名 说明
    pygame.draw.line(Surface, color, start_pos, end_pos, width) 绘制一条线段
    pygame.draw.aaline(Surface, color, start_pos, end_pos, blend) 绘制一条抗锯齿的线
    pygame.draw.lines(Surface, color, closed, pointlist, width) 绘制一条折线
    pygame.draw.rect(Surface, color, Rect) 绘制一个矩形
    pygame.draw.rect(Surface, color, Rect, width) 绘制一个矩形框
    pygame.draw.ellipse(Surface, color, Rect) 绘制一个椭圆
    pygame.draw.ellipse(Surface, color, Rect, width) 绘制一个多边形
    pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width) 绘制一条弧线
    pygame.draw.circle(Surface, color, Rect, radius) 绘制一个圆

    实操代码

    from math import pi
    import pygame
    pygame.init()
    screen = pygame.display.set_mode((400300))
    pygame.display.set_caption(("测试图形绘制"))
    # 定义颜色
    BLACK = (000)
    WHITE = (255255255)
    RED = (25500)
    GREEN = (02550)
    BLUE = (00255)
    # 背景颜色
    screen.fill(WHITE)
    # 绘制一条线
    pygame.draw.line(screen, GREEN, [00], [5030], 5)
    # 绘制一套抗锯齿线
    pygame.draw.aaline(screen, GREEN, [050], [5080], True)
    # 绘制一条折现
    pygame.draw.lines(screen, BLACK, False, [[080], [5090], [20080], [22030]], 5)
    # 绘制一个空心矩形
    pygame.draw.rect(screen, BLACK, [75105020], 2)
    # 绘制一个矩形
    pygame.draw.rect(screen, BLACK, [150105020])
    # 绘制一个空心椭圆
    pygame.draw.ellipse(screen, RED, [225105020], 2)
    # 绘制一个椭圆
    pygame.draw.ellipse(screen, RED, [300105020])
    # 绘制多边形
    pygame.draw.polygon(screen, BLACK, [[100100], [0200], [200200]], 5)
    # 绘制多条弧线
    pygame.draw.arc(screen, BLACK, [21075150125], 0, pi / 22)
    pygame.draw.arc(screen, GREEN, [21075150125], pi / 2, pi, 2)
    pygame.draw.arc(screen, BLUE, [21075150125], pi, 3 * pi / 22)
    pygame.draw.arc(screen, RED, [21075150125], 3 * pi / 22 * pi, 2)
    # 绘制一个圆
    pygame.draw.circle(screen, BLUE, [60250], 40)
    # 主程序循环
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 退出(处理了框体右上角x)
    exit()
    # 绘制屏幕内容
    pygame.display.update()

    效果展示

    在这里插入图片描述

    实现动画

    由于人类眼睛的特殊生理结构,当所看画面的帧率高于 24 的时候,就会认为是连贯的, 此现象称之为视觉暂留 . 帧率(Frame rate)是用于测量显示帧数的量度,所谓的测量单位为每秒显示帧数(Frames per Second,简称:FPS). 在我们原有坐标系的基础上添加偏移量,再重新绘制,依次一张一张的循环绘制下去, 就会得到我们想要的物体移动的效果

    Pygame 实现动画主要用到的方法如下表所示

    方法名 说明
    pygame.image.load(filename) 加载一张图片
    pygame.Surface.blit(source, dest, area=None, special_flags = 0) 将图片绘制到屏幕相应坐标上(后面两个参数默认, 可以不传)
    pygame.time.Clock() 获得 pygame 的时钟
    pygame.time.Clock.tick(FPS) 设置 pygame 时钟的间隔时间

    实操代码

    import sys
    import pygame
    pygame.init()
    # 设置帧率(屏幕每秒刷新次数)
    FPS = 60
    # 获得pygame的时钟
    fpsClock = pygame.time.Clock()
    # 设置窗口大小
    screen = pygame.display.set_mode((500400), 032)
    pygame.display.set_caption("测试pygame动画")
    # 定义颜色
    WHITE = (255255255)
    # 加载图片
    img = pygame.image.load("img/1.gif")
    # 初始化图片位置
    imgx, imgy = 00
    # 初始化图片移动方向
    direction = "right"
    # 程序主循环
    # 主程序循环
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 退出(处理了框体右上角x)
    pygame.quit()
    sys.exit()
    # 每次都要重新绘制背景白色
    screen.fill(WHITE)
    # 判断移动的方向, 并对相应的坐标做加减
    if direction == "right":
    imgx += 5
    if imgx == 380:
    direction = "down"
    elif direction == "down":
    imgy += 5
    if imgy == 300:
    direction = "left"
    elif direction == 'left':
    imgx -= 5
    if imgx == 10:
    direction = 'up'
    elif direction == 'up':
    imgy -= 5
    if imgy == 10:
    direction = 'right'
    # 该方法将用于图片绘制到相应的坐标中
    screen.blit(img, (imgx, imgy))
    # 刷新屏幕
    pygame.display.update()
    # 设置 pygame 时钟的间隔时间
    fpsClock.tick(FPS)

    效果展示

    图片会沿着边框四周滚动

    播放音乐

    在 Pygame 里播放音频有两个方法,一个用来播放特效声音,一个用来播放背景音乐:

  • pygame.mixer.Sound(filename) 该方法返回一个 Sound 对象,调用它的.play( )方法,即可播放较短的音频文件(比如玩家受到伤害、收集到金币等)

  • pygame.mixer.music.load(filename) 该方法用来加载背景音乐,之后调用 pygame.mixer.music.play( )方法就可以播放背景音乐(Pygame 只允许在同一个时刻加载一个背景音乐)

  • 实操代码

    import sys
    import pygame
    pygame.init()
    # 设置窗口的大小
    screen = pygame.display.set_mode((500400))
    pygame.display.set_caption("测试播放音乐")
    # 定义颜色
    WHITE = (255255255)
    # 设置背景
    screen.fill(WHITE)
    # 加载并播放特效音频
    sound = pygame.mixer.Sound('img/start.wav')
    sound.play()
    # 加载背景音乐文件
    pygame.mixer.music.load('img/fire.wav')
    # 播放背景音乐,第一个参数为播放的次数(-1 表示无限循环),第二个参数是设置播放 的起点(单位为秒)
    pygame.mixer.music.play(-10.0)
    # 主程序循环
    whileTrue:
    for event in pygame.event.get():
    if event.type == pygame.QUIT: # 退出(处理了框体右上角x)
    # 停止播放背景音乐
    pygame.mixer.music.stop()
    # 退出pygame
    pygame.quit()
    # 退出系统
    sys.exit()
    # 绘制屏幕内容
    pygame.display.update()

    今日冒险片段下

    众人也被打了个措手不及, 本来以为能够和平解决, 结果到现在却变成了这样. 因此众人只好应战, 但马塞尔毕竟不是罗斯特. 没用半天时间便将其打到力竭. 因为是奥菲利亚叔叔的原因, 众人都没有下重手, 因此马塞尔只是昏厥过去. 后续由他们内部自己处理. 经此一役, 了不起也成功的晋升到了lv26.
    在事情都解决之后, 四剑圣和圣骑士们变回到各自的管辖的区域了. 而在走之前了不起了从众人那里解到, 在暗精灵聚集的地方出现了黑色噩梦的气息, 这个气息很可能和之前了不起在格兰之森所僵尸王那里遇到的是一样的. 为了调查这个情报, 了不起依依不舍的告别了奥菲利亚, 开始前往暗精灵的聚集地....

    Sora最近老火了,Sora 的出现会对短视频、广告、游戏、影视行业等产业格局一定会被重塑,目前 Sora 还没正式开放注册,大家看到的使用体验大部分都来自官网,或者少部分的用户分享。

    为了避免更多读者受骗,我们直接给大家整了一个免费的。

    注意是下面【 Python都知道 】公众号,不是本公众号,点击下方的公众号卡片,然后回复【 sora ,即可获取最新 Sora 的最全资料。


    目前已经分享了,如何申请 Sora 的内测,以及最新关于 Sora 的技术特点,使用教程、变现机遇等等。

    大家如果想领取这份资料,可以点击下方的公众号卡片,然后回复 sora ,即可获取最新 Sora 的最全资料。

    需要提醒大家的是,Sora 目前还没有完全开放,任何市面上付费的一些课程,都请大家谨慎选择。

    可以确定的是:未来 10-20年,一定是 AI 的大风口、大时代,如果错过了公众号、错过了抖音、错过了小红书。

    请一定不要错过 AI +。

    面对浪潮,恐惧只会让我们伫立在原地,被巨浪吞噬。

    要去主动适应它,不被恐惧束缚,动起胳膊动起脚,才不会被淘汰。

    注意是下面【 Python都知道 】公众号,不是本公众号,点击下方的公众号卡片,然后回复 【 sora ,即可获取最新 Sora 的最全资料。