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

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 = 300load_image("assets/test.png")
# 在开始前加载素材文件
# 由于我的素材比较少,所以可以直接这么加载。有需要的也可以
# 通过os遍历整个素材文件夹然后加载所有内容。async def main():pg.init()screen = pg.display.set_mode((WIDTH, HEIGHT))clock = pg.time.Clock()color = 0incr = 2while True:screen.fill((color, color, color))screen.blit(load_image("assets/test.png"), (0, 0))color += incrif not 0 <= color <= 255:incr = -incrcolor += incrfor 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.mzph.cn/news/11340.shtml

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

相关文章

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一&#xff0c;环境 Windows 11 家庭中文版VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 二&#xff0c;关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三&#xff0c;详细步骤 在Ubun…

React 前端应用中快速实践 OpenTelemetry 云原生可观测性(SigNoz/K8S)

OpenTelemetry 可用于跟踪 React 应用程序的性能问题和错误。您可以跟踪从前端 web 应用程序到下游服务的用户请求。OpenTelemetry 是云原生计算基金会(CNCF)下的一个开源项目&#xff0c;旨在标准化遥测数据的生成和收集。已成为下一代可观测平台的事实标准。 React(也称为 Re…

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪&#xff0c;今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数&#xff1f; 内联函数 的语义很简单&#xff1a;把函数体复制粘贴到函数调用处 。使用起来也毫无困难&#xff0c;用 inline关键字修饰函数即可。 语法&a…

详解zookeeper安装使用

目录 1.概述 1.1.功能 1.2.特点 1.3.数据结构 2.安装 2.1.Windows 2.2.Linux 3.基础操作 3.1.增 3.2.删 3.3.改 3.4.查 3.5.监听 4.JAVA操作Zookeeper 4.1.依赖 4.2.客户端 4.3.增 4.4.删 4.5.查 4.6.改 1.概述 1.1.功能 zookeeper&#xff0c;Apache旗下…

pdf转换word软件哪个好?式?这款软件帮你轻松实现转换

在工作中&#xff0c;我们常常遇到这样的情况&#xff1a;我们的文件可能是PDF格式的&#xff0c;但对方要求我们以Word形式发送&#xff0c;因为Word相对于PDF占用更小的内存&#xff0c;打开更方便&#xff0c;发送时间更短。这时我们需要将PDF转换为Word格式&#xff0c;然而…

【跨代码仓库合并方案】

1、背景&#xff1a; 1、wiser绑定的uiidA的定制修改内容和ELKO绑定的uiidB基本是一样的&#xff0c;需要手动粘贴同步&#xff0c;增加测试保障风险&#xff0c;还会浪费开发资源投入&#xff1b; 2、施耐德wiser和elko面板两套面板基本一致&#xff0c;但是经过new art升级后…

机器学习深度学习——感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——softmax回归的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们…

市面上的ipad国产触控笔怎么样?精选的性价比电容笔

要知道&#xff0c;真正的苹果品牌的那款原装电容笔&#xff0c;光是一支电容笔就价格近千元。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。一支苹果品牌的电容笔&#xff0c;价格是平替品牌的四倍&#xff0c;但电容笔的书写效果&#xff0c;却丝毫不逊…

科技云报道:是时候全员FinOps了吗?

科技云报道原创。 在论坛上&#xff0c;国外某企业的真实案例引发了热议。一开始该企业只顾技术创新&#xff0c;积极上云&#xff0c;不顾成本。 直到有一天&#xff0c;高层介入喊停&#xff1a;“这个云不能再上了&#xff0c;成本已经远大于收益了”。该企业因为成本失控…

java-day01

一&#xff1a;基础常识 软件&#xff1a;按照特定顺序的计算机数据与指令的集合。可分为系统软件&#xff08;如操作系统&#xff09;和应用软件&#xff08;如QQ&#xff09; 人机交互方式&#xff1a;图形化界面&#xff08;GUI&#xff09;与命令行&#xff08;CLI&#…

性能优化 - 前端性能监控和性能指标计算方式

性能优化 - 前端性能监控和性能指标计算方式 前言一. 性能指标介绍1.1 单一指标介绍1.2 指标计算① Redirect(重定向耗时)② AppCache(应用程序缓存的DNS解析)③ DNS(DNS解析耗时)④ TCP(TCP连接耗时)⑤ TTFB(请求响应耗时)⑥ Trans(内容传输耗时)⑦ DOM(DOM解析耗时) 1.3 FP(f…

代码随想录算法训练营第二天| 977

977. 有序数组的平方y 思路&#xff0c;原数组是有序的&#xff0c;但是因为负数平方后可能变无序了&#xff0c;因此利用双指针遍历原数组&#xff0c;比较 nums[left]*nums[left]和nums[right]*nums[right]谁更大&#xff0c;然后对新数组赋值 class Solution {public int…

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录 GDI对象画笔和画刷来开发控件梯形边框的按钮控件CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp: 实现文件 矩形边框的三态按钮控件 CToolTipCtrl开发动…

欢乐暑假,华为儿童手表5系列为孩子位置安全保驾护航!

暑假带娃&#xff0c;就像爸妈的练兵场。幸好有 5 系列&#xff0c;离线定位、位置提醒、行为记录等安全守护功能面面俱到、样样精通&#xff0c;陪伴孩子度过悠长假期&#xff0c;也让爸妈长辈更安心更省力&#xff5e; 暑期到了&#xff0c;小朋友们都想出去玩&#xff0c;但…

修改密码和再次确认密码的js和element-ui的使用

<template><div><!-- plan的插槽 --><plan title"修改密码"><!-- 插槽的名字 --><span slot"header">修改密码</span><el-form:model"ruleForm2"status-icon:rules"rules2"ref"rul…

【数据结构】实验七:字符串

实验七 字符串实验报告 一、实验目的与要求 1&#xff09;巩固对串的理解&#xff1b; 2&#xff09;掌握串的基本操作实现&#xff1b; 3&#xff09;掌握 BF 和 KMP 算法思想。 二、实验内容 1. 给定一个字符串ababcabcdabcde和一个子串abcd,查找字串是否在主串中出现。…

【数据结构】实验一:绪论

实验一 绪论 一、实验目的与要求 1&#xff09;熟悉C/C语言&#xff08;或其他编程语言&#xff09;的集成开发环境&#xff1b; 2&#xff09;通过本实验加深对算法时间复杂度的理解&#xff1b; 3&#xff09;结合具体的问题分析算法时间复杂度。 二、实验内容 设计程…

深入学习 redis - Stream、Geospatial、HyperLogLog、Bitmap、Bitfields 类型扩展

目录 前言 Stream geospatial HyperLogLog Bitmaps Bitfields 前言 redis 中最关键的五个数据类型 String、List、Hash、Set、Zset 应用最广泛&#xff0c;同时 redis 也推出了额外的 5 个数据类型&#xff0c;他们分别是针对特殊场景才进行的应用的. Ps&#xff1a;这几种…

odoo16-domain

odoo16-domain 参考:https://blog.csdn.net/u013250491/article/details/86699928 domain的使用注意以下几点: 是在py文件中使用还是在xml中使用,py文件是在后端使用可以利用orm, 而xml是在前端渲染,使用的是js,没有办法使用orm如果在xml中使用,domain的格式建议为[[]], 二维…

Paragon NTFS2023最新版Mac读写NTFS磁盘工具

Paragon NTFS for Mac是Mac平台上一款非常优秀的读写工具&#xff0c;可以在Mac OS X中完全读写、修改、访问NTFS硬盘、U盘等外接设备的文件。这款软件最大的亮点简书可以让我们读写 NTFS 分区&#xff0c;因为在Mac OS X 系统上&#xff0c;默认状态下我们只能读取NTFS 分区&a…