python pygbag教程 —— 在网页上运行pygame程序(全网中文教程首发)

news2024/9/20 12:38:16

pygame是一款流行的游戏制作模块,经过特殊的方式编译后,可以在浏览器web网页上运行。web上的打包主要使用第三方模块pygbag。

pygame教程:Python pygame(GUI编程)模块最完整教程(1)_pygame模块详解_Python-ZZY的博客-CSDN博客

1 pygbag简介

pygbag是经过官方认可的一个第三方模块,专用于编译pygame使其在网页上运行(也可以在Android端网页上运行)。该网址演示了一个经过pygbag打包的pygame程序:Minesweeper by Python ZZY -China。

注意:在国内访问itch和github速度可能较慢,通常要加载很久。(建议开VPN)

pygbag打包后文件经过压缩,占用较少的空间。pygbag应用首次加载速度较慢,后面的速度会变快。

需要注意的是:pygbag依赖于Chrome内核的浏览器(如google, firefox),否则无法正常运行

pygbag源码:GitHub - pygame-web/pygbag: python and pygame wasm for everyone ( packager + test server + simulator )

2 安装

通过pip即可安装:


pip install pygbag

需要注意的是,pygbag依赖于一大堆的第三方库,所以强烈建议安装和使用都在虚拟环境中进行。

3 规范

进行打包的python-pygame程序文件夹中必须包含一个main.py文件(或者不使用文件夹而是一个单独的程序文件),作为应用运行的进入点。并且程序中的主循环必须以异步的形式进行,在进行异步的循环之前,最好提前定义常量、导入素材,以避免出现网络错误。

注意事项如下:

  • 需要包含一个main函数,并且是异步的形式
  • 可以在main函数的外面导入模块或导入一些必要的素材文件,这样能避免一些网络错误。
  • 素材中需要在pygame中播放的声音文件必须为*.ogg格式
  • 调用display.flip或update刷新pygame屏幕时,必须加上await asyncio.sleep(0)这一句。
  • 如果使用了3D/WebGL,打包时需要添加选项:--template noctx.tmpl

下面的例子叙述了代码的规范,读者可查看其中的注释:


import asyncio
import pygame as pg

# 在此处一次性定义所有常量,以便于编译
WIDTH = 700
HEIGHT = 300

# 如果有附带文件(图片、声音等素材文件),则在此处载入(可通过缓存lru_cache),以避免网络错误
# 在pygame播放的声音文件必须为*.ogg
...

async def main():

    pg.init()
    screen = pg.display.set_mode((WIDTH, HEIGHT))

    while True:
        # 在此处绘制屏幕、处理事件、控制帧率……

        for event in pg.event.get():
            ...
        
        pg.display.flip() # 或者:pg.display.update()
        await asyncio.sleep(0)  # 这行代码非常重要,相当于刷新屏幕,和flip()一起调用

# 这是程序的进入点
asyncio.run(main())

# 此处不要写任何代码

4 打包

打包时可以通过cmd调用pygbag。打包需要提供一个python文件或者一个包含main.py的文件夹。pygbag会将这个文件所在目录的所有东西打包到一起(或者将指定文件夹下的所有东西打包到一起),因此,无需提供依赖的文件。(这也意味着没有把素材放在同一文件夹而是随意放置的方式是行不通的)

最基本的打包方式如下:

python -m pygbag your.app.folder

此外还支持如下命令行选项(虽然数量多,但有用的不多):

选项如下(后面的[default]中是选项的默认值):
  -h, --help            显示
  --bind ADDRESS        指定备用绑定地址 [default: localhost]
  --directory DIRECTORY 指定替代目录 [default:/data/git/pygbag/your.app.folder/build/web]
  --PYBUILD PYBUILD     指定python版本 [default:3.11]
  --app_name APP_NAME   指定应用程序的用户名称 [default:your.app.folder]
  --ume_block UME_BLOCK 指定在运行前等待用户媒体参与 [default:1]
  --can_close CAN_CLOSE 指定是否窗口要求确认关闭(如果是,在关闭网页时会显示提示) [default:0]
  --cache CACHE         md5基于url的缓存目录(缓存可以避免重复加载,且会自动进行清理)
  --package PACKAGE     包裹名,最好是唯一的
  --title TITLE         应用的名称(网页标题)
  --version VERSION     覆盖预构建的版本路径 [default:0.6.0]
  --build               只进行构建,不运行测试服务器(默认可以在本机进行测试)
  --html                构建html,资源文件嵌入到html文件中
  --no_opt              关闭资源文件优化器(默认开启,此时可以压缩资源文件)
  --archive             生成build/web.zip文件,用于直接上传到itch.io
  --icon ICON           应用图标文件(png/ico,最小32x32)
  --cdn CDN             本地缓存网站(用于缓存一些必要的资源) [default:https://pygame-web.github.io/archives/0.6/]
  --template TEMPLATE   index.html样式模板 [default:default.tmpl]
  --ssl SSL             启用ssl加密(server.pem and key.pem)
  --port [PORT]         指定备用端口 [default: 8000]

下面将以一个程序为例展示部分选项的作用。

5 示例

程序展示

在开始打包前,先展示一下本次打包使用的程序示例,如下所示:


import asyncio
import pygame as pg
from functools import lru_cache

@lru_cache()
# 用于缓存函数的返回值:
# 程序中第二次调用该函数时,如果参数和原先一样,
# 那么直接返回第一次调用该函数时存储的值
def load_image(name):
    return pg.image.load(name)

WIDTH = 700
HEIGHT = 300

load_image("assets/test.png")
# 在开始前加载素材文件
# 由于我的素材比较少,所以可以直接这么加载。有需要的也可以
# 通过os遍历整个素材文件夹然后加载所有内容。

async def main():
    pg.init()
    screen = pg.display.set_mode((WIDTH, HEIGHT))
    clock = pg.time.Clock()

    color = 0
    incr = 2

    while True:
        screen.fill((color, color, color))
        screen.blit(load_image("assets/test.png"), (0, 0))

        color += incr
        if not 0 <= color <= 255:
            incr = -incr
            color += incr
        
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()

        clock.tick(60)
        pg.display.flip()

        await asyncio.sleep(0)

if __name__ == "__main__":
    asyncio.run(main())

运行此程序后,可以看见屏幕上显示了一张图片test.png,同时背景迅速地由白色变成黑色,然后再由黑色变成白色。

下面展示这个程序文件夹的目录(有一个main.py,还有一个assets文件夹来存放素材文件):

easy_game
│  main.py
└─ assets
      │  icon.png
      └─ test.png

接下来,正式进入打包教程环节。

打包

首先启动cmd,如有虚拟环境将其激活。进入easy_game所在的文件夹,输入:


python -m pygbag --title EasyGame --can_close 1 --icon easy_game\assets\icon.png easy_game

这表示将标题设置为EasyGame;图标为assets目录下的icon.png;退出游戏时会弹出提示框确认是否关闭。最后的easy_game是游戏文件夹。

 

经过一系列处理后,末尾显示在http://localhost:8000/运行测试界面,在本机上可以输入该网址试试打包后的效果。如果想要退出测试,在cmd按Ctrl+C即可。

如果在打包时加上--build参数,则不会运行测试。

初次加载时速度非常慢,但是之后再次启动时加载速度会变快,这是由于缓存的原因。作者在本机测试时效果非常不好,一直无法加载出来,并且还有很多404错误,打开VPN后效果明显变好。

调试

pygbag提供了一个调试debug页面,运行服务器后,进入网址:

http://localhost:8000#debug

发布到itch

发布pygbag程序主要是发布到itch(一个游戏平台),在其他地方发布比较麻烦。

首先需要进入游戏文件夹中的build文件夹,将其中的web文件夹压缩为zip文件。(如果打包时加上--archive选项,那么这个压缩包会自动生成)

然后进入https://itch.io/,此处省略登录等一系列流程。点开右上角的箭头,选择Upload new project上传项目(itch是支持中文的,可自行设置)。

填写项目标题后,找到下面的上传文件部分,点击Upload files,并将web.zip上传。(itch上传文件效果不好,如果文件大,必须开VPN才能成功上传)

然后在上面设置项目类型为HTML,同时勾选web.zip文件旁边下面的This file will be played in the browser。

 

还可以在下方设置游戏运行时的一些选项。选项包括:是否能在手机上运行,是否自动加载,是否允许全屏显示,是否支持滚动条等等。

可以在下方设置该游戏状态为公开。

最后保存页面。这样就完成了上传工作。

打开页面后点击Run Game,等它下载一会儿,然后就会跳出一个加载进度条。如果跳出了这个进度条说明前面的Downloading已经没有问题了,只需要一点时间加载一些素材。如果很长时间都停留在Downloading界面,可以右击页面选择“检查”,选择“控制台”,看是否出现了很多的错误;如果有错误可以重新加载页面。

加载完成后游戏即可在浏览器上运行。

发布到github 

首先下载这个文件:https://pygame-web.github.io/wiki/pygbag/github.io/pygbag.yml

 

打开文件后,可以把16行关于pygbag打包的语句修改掉。 

然后把这个文件放到你的仓库中,位于[你的仓库名]/.github/workflows(注意github前面的那个点不要忘了)。

接下来进入设置,将“工作流权限”设为可读可写。 按照步骤点击。

然后运行动作。

出现绿色的勾表示运行成功。运行成功后,会生成一个分支gh_pages。

再返回设置页面,将分支设为gh_pages,并保存。

返回Actions,此时会多出一个pages build and deployment自动运行。等待它运行完毕。

再返回Settings - Page,如果网站部署完成会在上方显示网址,点Visit site即可运行游戏。

如果网站上只显示了README,说明pages build and deployment还没有运行完成就启动了网站。需等待其运行完成再重启网站

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Day.4 刷题练习(自守数)

题目&#xff1a; 例子&#xff1a; 分析题目&#xff1a; 主要目的&#xff1a;给定一个范围小于等于N&#xff0c;在这个范围中找自守数&#xff08;自身等于平方后的尾部数据如5&#xff1a;5 ^ 2 25 &#xff0c; 然后 5 与 平方的后的尾部相等&#xff09; 思路&#x…

Windows安装PyTorch

文章目录 前言CPU版本安装安装步骤测试CPU版PyTorch是否安装成功 GPU版本安装新建一个conda环境安装torch法一&#xff1a;在线安装(建议用法二)法二&#xff1a;下载torch、torchvision后本地安装(建议使用此方法)Jupyter Lab虚拟环境的配置测试是否安装成功 前言 此份文档适…

2023 蓝桥杯真题B组 C/C++

https://www.dotcpp.com/oj/train/1089/ 题目 3150: 蓝桥杯2023年第十四届省赛真题-冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V&#xff0c;V 是一个正整数&#xff0c;这意味着消耗 V 个普通金 属 O…

【计算机网络】传输层协议 -- UDP协议

文章目录 1. 传输层相关知识1.1 端口号1.2 端口号范围划分1.3 知名端口号1.4 一些相关命令 2. UDP协议2.1 UDP协议格式2.2 UDP协议的特点2.3 什么是面向数据报2.4 UDP的缓冲区2.5 UDP使用注意事项2.6 基于UDP的应用层协议 1. 传输层相关知识 传输层是计算机网络中的一个重要层…

Spring Boot与MyBatis结合实现mock平台

上一章&#xff1a; 测开工具&#xff1a;spring boot 实现mock平台_springboot搭建mock_做测试的喵酱的博客-CSDN博客 代码地址&#xff1a; GitHub - 18713341733/mock: Spring Boot与MyBatis结合 实现对mock平台改造 一、背景 读取数据改为从mysql数据库中读取。 Sp…

redis群集(主从复制)

---------------------- Redis 主从复制 ---------------------------------------- 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xf…

QT基于TCP协议实现数据传输以及波形绘制——安卓APP及Windows程序双版本

文章代码有非常非常之详细的解析&#xff01;&#xff01;&#xff01;诸位可放心食用 这个玩意我做了两个&#xff0c;一个是安卓app&#xff0c;一个是Windows程序。代码并非全部都是由我从无到有实现&#xff0c;只是实现了我想要的功能。多亏了巨人的肩膀&#xff0c;开源…

农业中的计算机视觉 2023

物体检测应用于检测田间收割机和果园苹果 一、说明 欢迎来到Voxel51的计算机视觉行业聚焦博客系列的第一期。每个月&#xff0c;我们都将重点介绍不同行业&#xff08;从建筑到气候技术&#xff0c;从零售到机器人等&#xff09;如何使用计算机视觉、机器学习和人工智能来推动…

【导入外部jar包到maven项目中--亲测可行】

若项目为springweb项目&#xff0c;则先将jar放到WEB-INF/lib 目录下选中对应的jar包&#xff0c;右键选项 add-lirrary &#xff1b;成功加入之后的jar包是一个项目的目录结构&#xff1a; 至此&#xff0c;项目能够正常运行&#xff0c;在代码周也能够进行导包 转折点&…

Vue2 第二节 ----初识Vue(简单示例,模板语法,数据绑定)

知识点&#xff1a; 1.Vue的简单示例 2.模板语法 3.数据绑定 4.el和data的两种写法 5.MVVM模型 一. Vue的简单实例 <div id"root"><h1>hello, {{name.toUpperCase()}}, {{address}}</h1></div><script type"text/javascript&q…

2023年二季度中国手机销量排行榜:华为逆袭上榜,苹果仅位列第五,第一名很意外!

近日&#xff0c;国际数据公司&#xff08;IDC&#xff09;现发布最新手机季度跟踪报告显示&#xff0c;2023 年第二季度&#xff0c;中国智能手机市场出货量约 6,570 万台&#xff0c;同比下降 2.1%&#xff0c;降幅明显收窄。 今年上半年&#xff0c;中国智能手机市场出货量…

了解Unity编辑器之组件篇Physics 2D(十二)

一、Area Effector 2D区域施加力&#xff09;&#xff1a;用于控制区域施加力的行为 Use Collider Mask&#xff08;使用碰撞器遮罩&#xff09;&#xff1a;启用后&#xff0c;区域施加力仅会作用于特定的碰撞器。可以使用Collider Mask属性选择要作用的碰撞器。 Collider Ma…

揭秘低代码谜团,好用到不行

一、前言 低代码“灵活、快速、低门槛”的标签&#xff0c;为其带来了诸多争议。在低代码平台上是否只能搭建极其简单、无亮点的小功能&#xff1f;低代码带来的“全民程序员”化是否能真正带来社会价值&#xff1f;这是一场繁荣的泡沫假象&#xff0c;还是真实的市场需求&…

浅谈深拷贝与浅拷贝

一、拷贝&#xff08;克隆&#xff09;的意义的场景 意义&#xff1a;保证原数据的完整性和独立性 常见场景&#xff1a;复制数据、函数入参、class构造函数 二、浅拷贝 只克隆对象的第一层级如果属性值是原始数据类型&#xff0c;拷贝其值&#xff0c;即&#xff1a;值拷贝…

anaconda切换python版本

1 查看环境 conda env list结果如下图&#xff0c;左侧表示已下载的环境信息&#xff0c;当前我已经下载了python3.10&#xff08;python310&#xff09;和3.9&#xff08;python39&#xff09;两个版本 2 切换python版本 conda activate python3103 下载python # 下载pyt…

【玩转pandas系列】巧妙处理某瓣电影top250空数据

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 前言一、处理某瓣电影top250空数据二、对于空值&#xff0c;有没有别的处理办法&#xff1f;三、上述案例总结3.1 查看数据信…

个人博客系统 -- 博客列表页删除Markdown字符

之前的博客系统的列表页会有在markdown编辑器中的特殊字符,比如标题的字符#之类的,在列表页进行展示的时候,我们需要将这些字符进行筛选. 对这些字符进行筛选,我们可以通过排设计正则表达式进行筛选,也可以使用组件的方式进行筛选.下面我来总结一下,使用组件的方式进行筛选. 这…

Codeforces Round 886 (Div. 4)F题解

文章目录 [We Were Both Children](https://codeforces.com/contest/1850/problem/F)问题建模问题分析1.分析到达的点与跳跃距离的关系2.方法1倍数法累计每个点所能达到的青蛙数代码 方法2试除法累计每个点能到达的青蛙数代码 We Were Both Children 问题建模 给定n个青蛙每次…