PixiJS 修炼指南 - 01. 启程-环球实时
简介
什么是 PixiJS
PixiJS 是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。
【资料图】
这也使得它更专注于做好高效的2D渲染工作,给予WebGL高效渲染,实现上万对象渲染的粒子效果;同时也提供了更高的自由度,可用于做任何游戏类型的渲染层,甚至仅仅用于宣传页面的2D动画绘制。
同时,作为渲染引擎,它又比纯粹的 Canvas 使用起来更为便捷,可以直接通过操作 Sprite
、Container
、Graphics
等对象的属性完成画面中渲染效果的更新。
这样轻量易上手而又高效的渲染引擎,对于快速搭建轻量级的H5小游戏或者游戏 demo 来说可谓再合适不过。
而且,从2014年10月的第一个版本发布至今已过去近十年,仍然在不断更新迭代。2022年的 PixiJS v6 开始更是提供了 TypeScript 的支持,提供了内部对象更加方便的智能提示支持,也让大型项目使用 TS 开发后更加规范和可维护。最新的 v7 更是抛弃了各种历史包袱,更新到了现代化的前端项目生态,并且改进了一些历史 API(比如 interactive
),提供新的更深入优化项目性能的能力。
对于诸如骨骼动画、游戏滤镜、物理引擎、跨平台框架等需求,PixiJS 也有各种第三方工具、插件的支持,可扩展性也十分优秀。
为什么写这篇文章
这样优秀的工具,却可能因为官方团队人力有限无暇顾及文档维护,或是觉得都是基本的开发概念不需要再重新写文档赘述,官方的文档较为简陋,基本只是罗列 API 的参考手册。
对于之前没太多了解的新同学来说,上手可能要走不少弯路。
于是就想在个人学习的笔记基础上,梳理一个从基础概念开始的学习流程供大家参考,希望能对有需要的同学有所帮助。
搭建项目
首先,我们来搭建一个使用 PixiJS 渲染的游戏项目。
方法 1. 静态引用 dist 资源
如果只是想快速体验,可以参考官方文档指南,在页面内通过 <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 优化项目产物大小等前端构建项目的常用特性。
方法 2. 基于 npm 包构建(推荐)
这一途径则是在现有的前端构建项目中,通过 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
之外,主要有以下几个新面孔:
Text
Graphics
Sprite
以及 Application
的几个成员:
显然,Text
、Graphics
和 Sprite
将会是我们之后开发游戏常用的成员类型。其中的 Text
和 Graphics
顾名思义很好理解,就是 文本和 图形。而 Sprite
其实也是它的字面意思“精灵”,它是具有图形材质和一系列属性、操作方法的成员对象,是我们在游戏中直接操作的基础单元之一。
1. 容器与层级
如果查看他们的 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, //...);
2. 屏幕
除了 app.stage
之外,上面还用到了 app.screen
和 app.view
这两个 Application
的属性。
通过查看类型定义,我们发现前者的类型是 Rectangle
,即矩形,对其的官方定义为:
Rectangle
对象是一个由它左上角的 原点(x, y)
和自身 宽度width
+高度height
定义的区域。
而 app.screen
就是我们整个游戏应用的矩形渲染区域,平时游戏中只有位于这个区域内的可显示对象才能被用户在页面上看到。
3. 画布
最后的 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 的新宽高。所以还是需要获取后赋值传入,稍显啰嗦。
4. 更多适配
如果我们的游戏是面向移动端设备开发的话,还需要增加一个分辨率参数,以适配高分辨率设备的像素密度:
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.
环球热推荐:呼吸阀工作原理
历史新高!农行业绩发布透露
-
白衣天使的意思解释_白衣天
全球通讯!推荐一款轻量级全
科创板IPO新增63家按下“暂
20122013英超积分榜_2010英
天天视点!最新大学生秋游活
恒大3月销售额暴增至102亿
-
菲律宾停止和ICC合作,此前
【焦点热闻】有惊喜也有遗憾
软银将1.787亿股阿里股份转
《哈哈哈哈哈》第三季化身旅
美媒:被起诉是特朗普的“政
开封市顺河回族区军地联合为
-
云南景洪回应旅拍店拉客不成
天天报道:四川2025基本实现
青海:“税费管家”让税费服
国际学校ib课程体系是什么?
2023中国化工园区可持续发展
移民中国的条件和费用标准_
精彩推送
- PixiJS 修炼指南 - 01. 启程-环球实时
- 沪硅产业股东嘉定开发、中科园区拟合计减持不超1%:快看
- 环球热推荐:呼吸阀工作原理_带你了解一下呼吸阀
- 历史新高!农行业绩发布透露了哪些看点...
- 天天短讯!明发集团:2022年综合收入约105.684亿元
- 全球关注:德信中国:2022年总收入约人民币221.45亿元
- 白衣天使的意思解释_白衣天使的意思
- 全球通讯!推荐一款轻量级全栈式开源测试平台!
- 全球视点!佳兆业未来三年湾区旧改供货1530亿增长价值有望持续释放
- 天天实时:合景泰富:2022年实现收入134.52亿元
- 环球快报:建业地产:2022年收益约为人民币240.83亿元
- 融信中国:2022年实现收入300.59亿元_新消息
- 广东省环境保护基金会成立20周年 持续拓宽环保事业绿色发展路径
- 科创板IPO新增63家按下“暂停键”原因均系财报过期 焦点日报
- 中奥到家:2022年收益约为人民币17.02亿元
- 世界速读:融信服务:2022年总收益约为人民币8.76亿元
- 20122013英超积分榜_2010英超积分榜_世界热头条
- 环球微资讯!首批四单REITs扩募项目获中国证监会变更注册批复
- 大悦城地产:2022年实现收入208.31亿元
- 北京市挂牌两宗住宅用地,总起拍价56.3亿元,涉及大兴区、丰台区
- 天天视点!最新大学生秋游活动策划书 大学生秋游活动策划书十四篇(优秀)
- 世界视讯!宋都服务:2022年实现收入2.68亿元
- 恒大3月销售额暴增至102亿
- 远洋服务:2022年归属股东净利润人民币7540万元 热点在线
- 热点评!长沙越秀湘江星汇城百万新房漏水达38天 业主:我又不是鱼
- 深圳今年首批供地:5宗地块揽金72亿元 平均溢价率10.13%
- 弟弟两个月给女主播打赏13万元 姐姐:这是父母攒给他做手术的钱!_全球热点
- 百事通!一次购车100辆! 优信二手车合肥大卖场迎大买家
- 网络视听大咖说①叶蓁蓁:人类不能被人工智能取代
- 女子在长沙梵汐医美祛斑不成反遭“毁容” 谁来为我的皮肤买单 全球速读
- 菲律宾停止和ICC合作,此前菲被其指责“反人类”,认为ICC在干涉和攻击菲律宾的国家主权具体是什么情况_全球热文
- 恒生电子涨停 机构净买入4.03亿元 每日视讯
- 【全球速看料】美图公司港股跌9% 2022年无形资产减值亏损为4亿
- 世界速看:保持双轮驱动战略聚焦 新城控股2022年实现营收1154.57亿
- 全球速讯:给孩子买保险 到他们80岁才能拿回“本金”?泰康人寿屡遭投诉
- 房屋中介卖房赚佣金 青岛大云谷金茂府开发商翻脸不认人?
- 寿险与长护险责任转换业务试点5月1日起开展
- 【焦点热闻】有惊喜也有遗憾 高原试驾2023款坦克500
- 破发股万凯新材拟发不超27亿可转债 去年上市募30.6亿
- “PR融创01”将于2023年3月31日进行现金支付及小额兑付
- 今日热文:《北京市征收集体土地房屋补偿管理办法》公开征求意见
- 环球滚动:建发房地产:拟发行10亿元公司债券
- 力盟科技港股上市首日涨20% 募资净额0.97亿港元
- 中科博赛干细胞公司相关人被罚100万 利用互联网传销_每日时讯
- 三星医疗关联收购5医院 上交所问询溢价率高3标的亏损:全球短讯
- 心动公司去年净亏损收窄至5.53亿元 港股股价涨0.75% 热资讯
- 天天通讯!海昌海洋公园:2022年净亏损14.08亿元
- 软银将1.787亿股阿里股份转让给子公司
- 顺鑫牵手将亮相第108届全国糖酒会 共助行业更好发展
- 网络游戏板块涨3.87% 昆仑万维涨19.95%居首|看热讯
- 土地托管、以工代赈成“时尚” 内蒙古乡村为富民振兴配上“金钥匙”
- 德方纳米拟发不超35亿可转债 2019上市三度募资共48亿 今日关注
- 每日聚焦:食品加工制造板块涨0.81% 有友食品涨9.25%居首
- 蒙牛2022业绩|夯实基本盘,常温液奶持续扩大市场份额
- 【全球报资讯】“未来之城”雄安:海纳百川 汇聚人才
- 传媒板块涨3.91% 昆仑万维涨19.95%居首-环球报道
- 生物医药板块涨0.99% 新天地涨7.84%居首-环球速递
- 【天天播资讯】成都、上海轨道交通实现二维码跨区域互联互通
- 年报解读 | 合景悠活:市场化发展成果显著 稳健发展穿越周期
- 《哈哈哈哈哈》第三季化身旅行种草机 接水游戏笑翻全网 环球观热点
- 环球观焦点:河南洛阳生态环境局:强化自动监控帮扶 着力解决企业难题
- 【快播报】湖南14个城市环境空气平均优良天数比例为81.6%
- 美媒:被起诉是特朗普的“政治生涯灾难” 对候选人资格是致命问题|看热讯
- 北大荒集团洪河农场有限公司 引企入“乡” 走出一条合作发展新路
- 补贴收入是否缴纳增值税?政府补贴收入是什么意思?
- I Will Always Love You歌词是什么?原唱是谁? 环球播资讯
- 最新消息:柠檬茶怎么做?柠檬茶的做法步骤是什么?
- 有没有关于中秋节的古诗?中秋节的古诗集锦|当前速递
- 陕西汉中经四川巴中至南充铁路嘉陵江特大桥顺利合龙
- 全球快播:学古筝有什么好处?学习古筝的方法是什么?
- 陕西:加强湿地保护 维护湿地生态功能
- 全球观点:五年级数学学科工作计划怎么写?五年级数学教学工作计划(通用20篇)最新
- 补贴收入属于什么科目?补贴收入的会计分录介绍
- 演讲稿如何写?态度决定一切演讲稿范文5篇:环球速递
- 河南省环委办主任、生态环境厅厅长李哲到鄢陵县调研县城建成区黑臭水体治理工作
- 市场趋势怎么分析出来?分析市场趋势的方法介绍 市场趋势怎么描述
- 环球今日讯!关于负责培养人意见范文汇总 详情内容快来看看吧!
- 北京启动存量住房交易“带押过户”模式|全球头条
- 经典谜语大全带答案 快来欣赏一下吧!
- 中国的地名谜语你能猜对几个?中国最全的地名谜语及答案一览
- 三年级数学上册教学有什么计划?三年级人教版数学上册教学计划10篇最新:要闻
- 大学辅导员的工作计划4篇 感兴趣的小伙伴快来看看吧!
- 马尾罗星塔公园你去过吗?马尾罗星塔公园景点介绍|天天热文
- 观焦点:关于自然山水的经典古诗词有哪些?自然山水的经典古诗词大全
- 市场趋势怎么写范文?市场趋势调研报告怎么写?市场趋势是什么意思?
- 有关中秋节谜语大全及答案大全 有喜欢的小伙伴快来看看吧!-焦点短讯
- 党员的自传怎么写?党员的个人自传范文介绍
- 快消息!写给山区里的孩子一封信大全6篇 以供大家参考
- st板块所有股票怎么找?st板块涨停潮意味什么?炒ST板块的风险分析
- 促销活动计划方案范文五篇 希望大家喜欢
- 为什么黑鸡蛋比普通鸡蛋贵两三倍?乌鸡蛋和普通鸡蛋的区别是什么?-消息
- 韬光养晦的意思是什么?韬光养晦的成语典故介绍
- 环球简讯:10首经典伤感英文歌曲排行榜 有你喜欢的吗?
- 世界微资讯!网卡怎么免流?网卡免流的方法是什么?
- 天天要闻:163邮件格式怎么写?QQ邮箱格式怎么写?
- 全球讯息:高中生军训心得体会怎么写?高中生军训心得体会最新7篇
- 家常凉面怎么做?家常凉面的做法是什么?:全球看热讯
- 【全球热闻】棉麻布料会缩水吗?棉麻布料的优缺点是什么?
- 关于墙面装修 这些误区你一定要知道:世界百事通
- 《活学活用厚黑学》是谁?是哪一年出版的图书?
金融
财经
要闻
公司
吉卜力工作室如今已加入到主题公园的浪潮,并于11月1日正式对公众开放全球首个项目,将《龙猫》等经典作品的场景复原至现实世界。对于吉卜
详细>>随着在线旅游企业数量的不断增多,售卖不合理低价旅游产品、违规利用用户个人信息等问题也时有发生。11月1日,文旅部发布《文化和旅游部关
详细>>两个小时,这是越南全国首票榴莲从装车到运送至我国广西崇左友谊关口岸的时间。得益于一体化供应链,2021年,中国与越南进出口贸易额达到23
详细>>11月1日,北京商报记者梳理发现,截至9月末,10家A股上市农商行资产规模均有所扩大,重庆农商行、上海农商行仍以万亿元总资产位居前列。营
详细>>西贝餐饮集团(以下简称西贝)在儿童餐的道路上越走越深。11月1日,北京商报记者从西贝获悉,其将推出西贝儿童餐零售产品。目前,部分西贝门
详细>>新一期麻辣粉和逆回购操作如期公布。9月15日,央行发布消息称,为维护银行体系流动性合理充裕,开展4000亿元中期借贷便利(MLF)操作和20亿元
详细>>