PixiJS 是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。
这也使得它更专注于做好高效的2D渲染工作,给予WebGL高效渲染,实现上万对象渲染的粒子效果;同时也提供了更高的自由度,可用于做任何游戏类型的渲染层,甚至仅仅用于宣传页面的2D动画绘制。
(资料图片仅供参考)
同时,作为渲染引擎,它又比纯粹的 Canvas 使用起来更为便捷,可以直接通过操作 Sprite、Container、Graphics等对象的属性完成画面中渲染效果的更新。
这样轻量易上手而又高效的渲染引擎,对于快速搭建轻量级的H5小游戏或者游戏 demo 来说可谓再合适不过。
而且,从2014年10月的第一个版本发布至今已过去近十年,仍然在不断更新迭代。2022年的 PixiJS v6 开始更是提供了 TypeScript 的支持,提供了内部对象更加方便的智能提示支持,也让大型项目使用 TS 开发后更加规范和可维护。最新的 v7 更是抛弃了各种历史包袱,更新到了现代化的前端项目生态,并且改进了一些历史 API(比如 interactive),提供新的更深入优化项目性能的能力。
对于诸如骨骼动画、游戏滤镜、物理引擎、跨平台框架等需求,PixiJS 也有各种第三方工具、插件的支持,可扩展性也十分优秀。
这样优秀的工具,却可能因为官方团队人力有限无暇顾及文档维护,或是觉得都是基本的开发概念不需要再重新写文档赘述,官方的文档较为简陋,基本只是罗列 API 的参考手册。
对于之前没太多了解的新同学来说,上手可能要走不少弯路。
于是就想在个人学习的笔记基础上,梳理一个从基础概念开始的学习流程供大家参考,希望能对有需要的同学有所帮助。
首先,我们来搭建一个使用 PixiJS 渲染的游戏项目。
如果只是想快速体验,可以参考官方文档指南,在页面内通过 <script>标签引入 PixiJS 的 dist 文件后,直接在静态项目内体验使用 PixiJS:
<script src="https://pixijs.download/release/pixi.js"></script><script> const { Application } = window.PIXI; const app = new Application({ width: 640, height: 360, backgroundColor: 0x6495ed, }); document.body.appendChild(app.view);</script>这一方式的优点是快速可用。
但缺点也很明显,没有构建环境的支持无法使用 TypeScript 等相关能力,也不具备 Tree Shaking 优化项目产物大小等前端构建项目的常用特性。
这一途径则是在现有的前端构建项目中,通过 npm/pnpm 安装 PixiJS,再 import 需要的模块到页面内进行开发。
优点是可以完整地使用所有 PixiJS 应有的能力,以及前端构建项目所具有的所有便捷特性。缺点是搭建最初的项目结构稍微需要花一点时间。
推荐使用 Vite 创建一个基本的 Vanilla + TypeScript 项目,再安装 pixi.js和几个常用的 PixiJS 基本子包:
$ npm create vite@latest my-pixi-demo$ cd my-pixi-demo$ npm install -S pixi.js @pixi/utils然后清空项目的入口脚本(一般为 src/main.ts),修改为:
import { Application } from "pixi.js";const app = new Application({ width: 640, height: 360, backgroundColor: 0x6495ed,});document.body.appendChild(app.view as HTMLCanvasElement);启动开发构建服务:
$ npm run dev点击打开出现的开发预览页面链接,不出意外的话,就能看到游戏的画布出现在浏览器内了。
刚才我们搭建完项目后,创建了一个 PixiJS 提供的 Application对象,它就是我们开发的 游戏应用了。
只不过目前它里面空空如也,只是绘制了一个指定背景色和宽高尺寸的空画布。
接下来我们就要往里面加入各种成员,让它热闹起来。
import { Application, Graphics, Sprite, Text,} from "pixi.js";const app = new Application({ width: 640, height: 360, backgroundColor: 0x6495ed,});document.body.appendChild(app.view as HTMLCanvasElement);// 创建文本成员const slogan = new Text("Hello, developer!", { fill: 0xffffff, fontSize: 32,});slogan.position.set(20, 20);// 创建图形成员const sloganBg = new Graphics();sloganBg.position.set(10, 10);sloganBg.lineStyle(4, 0x333333, .25);sloganBg.beginFill(0xefefef, .5);sloganBg.drawRoundedRect(0, 0, slogan.width + 20, slogan.height + 20, 10);sloganBg.endFill();app.stage.addChild(slogan, sloganBg);// 创建精灵成员const sprite = Sprite.from("https://hk.krimeshu.com/sprite-minion.png");sprite.anchor.set(0.5, 0.5);sprite.position.set(app.screen.width / 2, app.screen.height / 2);app.stage.addChild(sprite);效果大致如下:
上面的例子中,除了之前提到的 Application之外,主要有以下几个新面孔:
TextGraphicsSprite以及 Application的几个成员:
显然,Text、Graphics和 Sprite将会是我们之后开发游戏常用的成员类型。其中的 Text和 Graphics顾名思义很好理解,就是 文本和 图形。而 Sprite其实也是它的字面意思“精灵”,它是具有图形材质和一系列属性、操作方法的成员对象,是我们在游戏中直接操作的基础单元之一。
如果查看他们的 type 声明就会发现,它们具有这样的继承派生关系:
符号
->表示继承。
Graphics -> ContainerSprite -> ContainerText -> Sprite -> Container可见它们都属于一个共同的祖先类别 Container,而 Container又继承于更原始的 DisplayObject。
可推测 DisplayObject是 PixiJS 中可用于绘制的 可显示对象,应该是渲染底层操作的基础单位。
而 Container是在 DisplayObject的基础上具有类似 Web 节点性质的树形结构对象。整个游戏需要绘制的成员,都以嵌套的树形结构最终挂载于 app.stage这个顶级 Container之下。
实际上因为 PixiJS 没有 CSS 的层级概念,绘制时其实就是按照遍历整个 app.stage的树形结构,从上到下、从前到后进行绘制,后绘制对象覆盖先绘制的对象的优先级来决定层级覆盖关系。
Graphics、Sprite和 Text则是在 Container基础上,拥有更多特化后的绘制能力和操作方法的可显示对象具体子类。将它们的实例通过 addChild加入到游戏的 app.stage中,就会被 PixiJS 绘制出来,最终出现在我们眼前了。
const text1 = new Text("...");const text2 = new Text("...");// ...app.stage.addChild( text1, text2, //...);除了 app.stage之外,上面还用到了 app.screen和 app.view这两个 Application的属性。
通过查看类型定义,我们发现前者的类型是 Rectangle,即矩形,对其的官方定义为:
Rectangle对象是一个由它左上角的 原点(x, y)和自身 宽度width+高度height定义的区域。
而 app.screen就是我们整个游戏应用的矩形渲染区域,平时游戏中只有位于这个区域内的可显示对象才能被用户在页面上看到。
最后的 app.view则是 PixiJS 应用的渲染器所持有的 Canvas 画布对象引用。
在我们的例子中,因为创建 Application时没有传入画布对象,所以 PixiJS 内部会帮我们创建符合指定属性的画布,并挂载在 app实例的 view属性上。在这一切完成之后,我们最后将创建的 app.view画布通过 appendChild()加入到页面的 DOM 树内。
同样的,我们也可以不使用自动创建的画布,而是使用页面上已有的 Canvas 画布对象来创建 Application应用对象:
const canvas = document.querySelector("#cvsMyGame");const app = new Application({ view: canvas, width: canvas.width, height: canvas.height,});这个例子里,如果我们不将 canvas 的宽高传给 Application的构造参数,PixiJS 将会用一个默认的尺寸创建游戏,并修改为 canvas 的新宽高。所以还是需要获取后赋值传入,稍显啰嗦。
如果我们的游戏是面向移动端设备开发的话,还需要增加一个分辨率参数,以适配高分辨率设备的像素密度:
const app = new Application({ view: canvas, width: canvas.width, height: canvas.height, resolution: window.devicePixelRatio || 2,});不过如果我们的游戏应用与网页视口的尺寸始终保持一致(即所谓的“全屏游戏”)的话,其实可以也不用传入这么多参数,只需要这样配置:
const app = new Application({ view: canvas, resizeTo: window, autoDensity: true,});通过 resizeTo属性指定应用画布跟随网页窗口尺寸,还可以在用户屏幕旋转、调整窗口尺寸后由 PixiJS 自动调整画布尺寸,以适配用户设备的最新画面状态。
——不过页面内的成员坐标和尺寸并不会按新旧尺寸的比例进行调整更新,毕竟实际游戏场景的成员数可能相当多,而且不同成员的定位适配策略通常并不相同,还是需要在检测到对应 resize事件后自行调整。
这次我们创建了一个基本的 PixiJS 游戏应用,并对一些基础概念进行了说明。
但这个基本 demo 中还是有不少东西没有说清楚,并且这个应用的代码也没有合理组织,之后我们将在这个基础上继续补充和完善。
如果有什么纰漏与谬误欢迎指出~
关键词:
环球快消息!PixiJS 修炼指南 - 01. 启程 PixiJS是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。
明发集团2022年收入105.68亿元 同比减少35.6%_播资讯 毛利约为人民币22 88亿元,较2021年减少53 8%;年度利润由2021年减少99 1%至1860万元;公司权益持有人应占利润分别约为人民币4800万...
世界快资讯丨【期市星期五】纸浆“跌跌不休”创15个月来新低;苹果期货遭重挫,现... 金融界3月31日消息本周(3月27日―3月31日),国内商品期货多数上涨,棉纱以5 16%的涨幅位居榜首,其次为铁矿石和燃料油,当周涨幅分别为4 67%和4
每日热门:安卓9.0终于公布正式命名——Android P,7大全新功能你期待吗? 【旗龙网:2018年8月8日消息】随着手机的不断更新,当然手机的系统也在不断的更新,昨天小编看到了一条让人嘴馋的信息,那就是安卓9 0终于公布
六个方面40项130条 辽宁税务推出便民办税缴费措施 据了解,在诉求响应提质方面,辽宁税务推出开展税费优惠政策推送、畅通诉求表达权益保障通道等7项25条措施,提升办税缴费体验。为提升办...
世界热讯:首批公募REITs扩募正式获批 首批公募REITs扩募正式获批:上交所和深交所官网显示,中金普洛斯REIT、华安张江光大REIT、博时蛇口产园REIT和红土盐田港(000088)REIT的扩募
环球快消息!PixiJS 修炼指南 - 01. 启程 PixiJS是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。
每日观点:3月基金发行迎“小阳春” 增量资金等待时机进场 【3月基金发行迎“小阳春”增量资金等待时机进场】数据显示,今年以来公募基金市场发行逐月回暖,3月基金募集总规模触及今年以来单月新...
突然宣布:“封杀”ChatGPT!打响人类保卫战第一枪!-视焦点讯 意大利打响了人类保卫战的第一枪?意大利:即日起禁止使用ChatGPT就在刚刚,意大利出手打击全世界最火的人工智能ChatGPT!据意大利数据保护局(
明发集团2022年收入105.68亿元 同比减少35.6%_播资讯 毛利约为人民币22 88亿元,较2021年减少53 8%;年度利润由2021年减少99 1%至1860万元;公司权益持有人应占利润分别约为人民币4800万...
世界快资讯丨【期市星期五】纸浆“跌跌不休”创15个月来新低;苹果期货遭重挫,现... 金融界3月31日消息本周(3月27日―3月31日),国内商品期货多数上涨,棉纱以5 16%的涨幅位居榜首,其次为铁矿石和燃料油,当周涨幅分别为4 67%和4
天天百事通!首席经济学家七人谈:二季度GDP同比增速或超7% 财政货币政策将继续发力 今年一季度,我国经济运行呈现较为明显的企稳回升态势,物价就业总体稳定、生产需求回升向好、市场主体发展预期改善、金融数据表现良好。
环球头条:美图去年净利润同比增近30% AIGC在B端将大有可为 3月30日晚,美图公司发布2022年业绩报告。报告期内,公司实现总收入20 85亿元,同比增长25 2%。经调整后归属于母公司权益持有人的净利润1 11亿
今日关注:永兴材料2022年净利超60亿元 锂价下行或冲击未来业绩 锂云母龙头迎来收获期。近日,永兴特种材料科技股份有限公司(以下简称“永兴材料”,002756 SZ)披露2022年年度报告。2022年,公司盈利...
制造业PMI连续三月位于扩张区间 建筑业持续高景气 经济发展仍在企稳回升中。3月31日,国家统计局服务业调查中心和中国物流与采购联合会发布了最新中国采购经理指数(PMI)。数据显示,3月制造业PM
每日热门:安卓9.0终于公布正式命名——Android P,7大全新功能你期待吗? 【旗龙网:2018年8月8日消息】随着手机的不断更新,当然手机的系统也在不断的更新,昨天小编看到了一条让人嘴馋的信息,那就是安卓9 0终于公布
六个方面40项130条 辽宁税务推出便民办税缴费措施 据了解,在诉求响应提质方面,辽宁税务推出开展税费优惠政策推送、畅通诉求表达权益保障通道等7项25条措施,提升办税缴费体验。为提升办...
全市场唯一!招商产业债券荣获2023晨星普通债券型基金奖 3月31日,Morningstar晨星(中国)2023年度基金奖揭晓,招商基金马龙管理的招商产业债券(基金代码:A类217022C类001868)荣获2023年度晨星普通债
全球热点!焦化业务亏损 陕西黑猫偿债压力高企 3月31日晚间,陕西黑猫(601015 SH)发布年度业绩报告称,公司2022年实现营收232 00亿元,同比增长22 78%;实现归属于上市公司股东的净利润2 78
公告精选丨腾讯控股向港交所申请增设人民币柜台 世界时讯 今日焦点腾讯控股:向港交所申请增设人民币柜台腾讯控股在港交所发布公告,当日已向香港联交所提交申请增设人民币柜台,以支持联交所的...
中金公司:2022年归母净利同比降29.51%至75.98亿元 拟10派1.8元 中金公司3月31日公告,2022年度归母净利润75 98亿元,同比下降29 51%;营收260 87亿元,同比下降13 42%。拟每10股派发现金股利1 80元。
环球精选!同道猎聘2022年财报:全年营收26亿 企业用户数同比增长12.6% 3月31日,同道猎聘集团发布2022年第四季度及全年业绩。财报显示,猎聘2022年全年营收26 4亿元人民币,经调整归母净利润1 9亿元人民币。其中,
热点聚焦:安科生物:公司曲妥珠单抗正在按药审中心发补要求补充相关资料 安科生物3月31日在投资者互动平台表示,我公司曲妥珠单抗正在按药审中心发补要求补充相关资料,目前相关资料工作进展顺利,公司尽快将补...
中欧基金葛兰年报隐形重仓股出炉 新进联影医疗、大幅加仓华润三九_当前视点 3月31日,中欧基金权益投决会委员、投资总监葛兰管理的基金悉数披露了2022年年报,其持仓中的隐形重仓股和最新观点也随之出炉。截至2022年末,
美国2月份个人消费支出价格指数环比上升0.3% 央视新闻消息,据美国经济分析局当地时间3月31日公布的数据,美国衡量通胀的指标,个人消费支出(PCE)价格指数于2月份环比上升0 3%,较去年2月
数字化服务商启明信息2022年营收15.41亿元 3月31日,启明信息发布了2022年财报,营收15 41亿元,较上年增长46 61%,扣非净利润5649 33万元,较上年增长115 62%。根据财报,2022年启明信
天天热资讯!江波龙:接受线上参与公司2022年度业绩说明会的投资者调研 江波龙(SZ301308,收盘价:98 71元)发布公告称,2023年3月29日下午15:00~16:30,江波龙接受线上参与公司2022年度业绩说明会的投资者调研,公司
宗申动力2022年扣非净利润小幅增长 将加快推进三大业务升级 宗申动力3月31日晚间公布的2022年年报显示,公司实现营业收入80 00亿元,同比减少12 83%;归母净利润3 90亿元,同比减少17 84%;扣非后净利润3
杰瑞股份:沙特阿美为公司在中东地区的重要客户之一 杰瑞股份3月31日在互动平台回答投资者提问时表示,中东市场是公司重要海外市场,公司为沙特、阿联酋、科威特等市场提供设备及配件销售、...
世界热讯:首批公募REITs扩募正式获批 首批公募REITs扩募正式获批:上交所和深交所官网显示,中金普洛斯REIT、华安张江光大REIT、博时蛇口产园REIT和红土盐田港(000088)REIT的扩募
恒生电子:3月30日召开董事会会议 全球快看点 恒生电子(SH600570,收盘价:53 22元)3月31日晚间发布公告称,公司第八届第七次董事会会议于2023年3月30日以现场结合通讯表决的方式召开。审议
恒生电子:2022年净利同比降25.45% 拟10派1.3元_世界速讯 【恒生电子:2022年净利同比降25 45%拟10派1 3元】恒生电子(600570)3月31日晚间披露年报,公司2022年实现营业收入65 02亿元,同比增长18 3%;
美国3月对欧石脑油出口增至11个月高点 填补俄罗斯供应缺口 【美国3月对欧石脑油出口增至11个月高点填补俄罗斯供应缺口】彭博3月31日消息,美国3月对欧洲石脑油出口增至11个月高点,填补欧盟对俄产品禁令
平安证券给予邮储银行强烈推荐评级 息差缩窄拖累营收 定增落地扩张空间 平安证券03月31日发布研报称,给予邮储银行(601658 SH,最新价:4 65元)强烈推荐评级。评级理由主要包括:1)营收增速放缓,中收维持高增态势;
今日热议:即日起旅游包车周末免费通行河北高速 【即日起旅游包车周末免费通行河北高速】记者从河北省交通运输厅获悉,从3月31日起,河北省在每周的周五12:00至周日20:00推出旅游包车高速通行
意大利国家现当代美术馆精粹展开展
62幅稀世真迹震撼来深-环球热点评 观众聚精会神地欣赏作品。深圳特区报记者刘真摄读特客户端·深圳新闻网2023年3月25日讯(深圳特区报首席记者焦子宇)3月24日,“气象万...
突然宣布:“封杀”ChatGPT!打响人类保卫战第一枪!-视焦点讯 意大利打响了人类保卫战的第一枪?...
今日关注:永兴材料2022年净利超60亿元 锂价下行或冲击未来业绩 锂云母龙头迎来收获期。近日,永兴...
制造业PMI连续三月位于扩张区间 建筑业持续高景气 经济发展仍在企稳回升中。3月31日...
全球热点!焦化业务亏损 陕西黑猫偿债压力高企 3月31日晚间,陕西黑猫(601015 SH...
怎样保存大米一年不坏?真空大米放了3—4年还能吃么? 怎样保存大米一年不坏?1、用锅煮花...
最新消息:河北省40幅摄影作品参加第三十四届华北摄影艺术展览 近日,第三十四届中国华北摄影艺术...
获奖名单公布!第十三届中国艺术节在河北雄安新区落下帷幕 9月15日晚,第十三届中国艺术节在...
2022北京时装周9月15日至22日将在线上线下举办多场活动 一年一度的北京时装盛典即将拉开帷...