您的位置: 首页 > 业界 > 正文

世界快报:PixiJS 修炼指南 - 01. 启程

2023-03-31 12:55:23 来源:腾讯云

简介

什么是 PixiJS

PixiJS 是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。


(资料图片仅供参考)

这也使得它更专注于做好高效的2D渲染工作,给予WebGL高效渲染,实现上万对象渲染的粒子效果;同时也提供了更高的自由度,可用于做任何游戏类型的渲染层,甚至仅仅用于宣传页面的2D动画绘制。

同时,作为渲染引擎,它又比纯粹的 Canvas 使用起来更为便捷,可以直接通过操作 SpriteContainerGraphics等对象的属性完成画面中渲染效果的更新。

这样轻量易上手而又高效的渲染引擎,对于快速搭建轻量级的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之外,主要有以下几个新面孔:

TextGraphicsSprite

以及 Application的几个成员:

app.stageapp.screenapp.view

显然,TextGraphicsSprite将会是我们之后开发游戏常用的成员类型。其中的 TextGraphics顾名思义很好理解,就是 文本图形。而 Sprite其实也是它的字面意思“精灵”,它是具有图形材质和一系列属性、操作方法的成员对象,是我们在游戏中直接操作的基础单元之一。

1. 容器与层级

如果查看他们的 type 声明就会发现,它们具有这样的继承派生关系:

符号 ->表示继承。

Graphics -> ContainerSprite -> ContainerText -> Sprite -> Container

可见它们都属于一个共同的祖先类别 Container,而 Container又继承于更原始的 DisplayObject

可推测 DisplayObject是 PixiJS 中可用于绘制的 可显示对象,应该是渲染底层操作的基础单位。

Container是在 DisplayObject的基础上具有类似 Web 节点性质的树形结构对象。整个游戏需要绘制的成员,都以嵌套的树形结构最终挂载于 app.stage这个顶级 Container之下。

实际上因为 PixiJS 没有 CSS 的层级概念,绘制时其实就是按照遍历整个 app.stage的树形结构,从上到下、从前到后进行绘制,后绘制对象覆盖先绘制的对象的优先级来决定层级覆盖关系。

GraphicsSpriteText则是在 Container基础上,拥有更多特化后的绘制能力和操作方法的可显示对象具体子类。将它们的实例通过 addChild加入到游戏的 app.stage中,就会被 PixiJS 绘制出来,最终出现在我们眼前了。

const text1 = new Text("...");const text2 = new Text("...");// ...app.stage.addChild(  text1,  text2,  //...);

2. 屏幕

除了 app.stage之外,上面还用到了 app.screenapp.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 中还是有不少东西没有说清楚,并且这个应用的代码也没有合理组织,之后我们将在这个基础上继续补充和完善。

如果有什么纰漏与谬误欢迎指出~

关键词:

415只个股市值低于20亿元 散户投资者将被逐渐边缘化
数据显示,截至8月5日收盘,A股共有415只个股市值低于20亿元,占整体A股总数的近一成。业内专家认为,随着注册制的全面实施,小市值股的数
2022-08-29
湖南省人社厅公布7个热门职业的专项职业能力考核规范
怎样开展直播、进行直播复盘?母婴护理需要掌握哪些技巧……近日,湖南省人社厅公布电商直播销售、母婴护理等7个热门职业的专项职业能力考核
2022-06-20
唐山曹妃甸推动京津冀协同发展 产业协同转移全面提速
春暖渤海湾,书写新画卷。位于唐山曹妃甸的金隅天坛(唐山)木业科技有限公司的生产车间内一片繁忙景象——铺装、压机、翻板等工作正紧张有序
2022-03-19
石家庄海关共签发RCEP原产地证书864份 货值3.9亿元
自今年1月1日RCEP(《区域全面经济伙伴关系协定》)正式实施以来,截至3月14日,石家庄海关共签发RCEP原产地证书864份,货值3 9亿元。据介绍
2022-03-19
蚌埠海关累计签发RCEP原产地证书35份 涉及金额2583.09万元
在蚌埠海关报关大厅原产地证办理窗口,海关关员仔细核对着递交过来的材料。十分钟后,一份RCEP原产地证书打印盖章后交到了企业业务员手中。
2022-03-19
昆明西山区:“双招双引”推动人才链和产业链融合发展
为激励党员干部在营商环境建设中担当作为,昆明市西山区深入实施人才强区战略和人才领跑工程,建立健全招商引资和招才引资并轨新模式,以产
2022-03-19
世界快报:PixiJS 修炼指南 - 01. 启程
PixiJS是一个使用便捷且高效的2D渲染引擎——没错,它不是大而全的游戏引擎,而是更轻量的渲染引擎。
2023-03-31
天天速读:港股异动 | 海尔智家(06690)跌7% 22年归母溢利增12.5% 每10股派5.66元 机构指其年度经营承压
海尔智家(06690)绩后低迷,早盘跌约7%。22年,公司实现收入同比增7 2%,归母溢利同比增12 5%;拟每10股派现金5 66元。长江点评称,22Q4的阶段
2023-03-31
世界头条:回天新材:3月30日融券卖出300股,融资融券余额1.7亿元
3月30日,回天新材(300041)融资买入385 84万元,融资偿还546 98万元,融资净卖出161 15万元,融资余额1 7亿元,近20个交易日中有13个交易日
2023-03-31
环球焦点!北京市海淀区将建立一所十五年制现代化特殊教育学校
北京市海淀区将建立一所十五年制现代化特殊教育学校
2023-03-31
全球焦点!中超选开幕式举办地 新工体胜算最大
工体曾承办2010赛季中超开幕式  在3月29日举行的媒体通气会上,中足联筹备组竞赛工作负责人郭炳颜透露,新赛季中超联赛的筹备工作仍然以4月1
2023-03-31
环球头条:危机尚未结束!嘉信理财存款流出速度超预期两倍 遭大摩七年来首次下调评级
摩根士丹利的分析师七年来首次取消了对嘉信理财(SCHW US)的“买入”评级。摩根士丹利表示,嘉信理财客户移出资金的速度
2023-03-31
沧州:8个重大科技专项项目确定 引领经济社会高质量发展
为充分发挥科技在经济社会高质量发展中的引领和支撑作用,沧州市确定8个项目为2021年全市重大科技专项项目。这8个重大科技专项项目分别为:
2022-03-19
  中新网海口1月23日电(王子谦 符宇群)海南省高级人民法院院长陈凤超23日说,2021年海南法院为自贸港建设提供坚强司法保障,全年有效管
2022-01-24
  新华社武汉1月23日电(记者王贤)随着春节假期临近,从广州、深圳等地返回湖北的旅客较多。为此,23日,武汉站、汉口站、襄阳东站、十堰
2022-01-24
  1月22日0—24时,广东省新增本土确诊病例3例和本土无症状感染者1例,均为珠海报告。23日,珠海市疫情防控新闻发布会上,珠海市政府副秘
2022-01-24
青海海西州德令哈市发生3.7级地震
  据中国地震台网正式测定,1月23日11时58分在青海海西州德令哈市发生3 7级地震,震源深度9千米,震中位于北纬38 40度,东经97 35度。
2022-01-24
  北京2022年冬奥会和冬残奥会颁奖花束已于近期完成交付。与传统的鲜切花不同,这些花束全部采用上海市非物质文化遗产“海派绒线编结技艺
2022-01-24
  中新网宿迁1月23日电 (刘林 张华东)核酸检测是当下及时发现潜在感染者、阻断疫情传播的有效方法。23日,记者从宿迁市宿豫区警方获悉
2022-01-24
  记者从天津市人社局获悉,从明天(24日)起,天津2022年度第一期积分落户申报工作正式开始,这是新修订的《天津市居住证管理办法》《天津
2022-01-24
  中新社北京1月23日电 (记者 刘亮)记者23日从中国海关总署获悉,2021年,中国海关组织开展“国门绿盾”专项行动,在寄递、旅客携带物
2022-01-24
  记者从天津市疫情防控指挥部获悉,天津疫情第341—360例阳性感染者基本信息公布。  目前,这20例阳性感染者已转运至市定点医院做进一
2022-01-24
“最美基层民警”武文斌:案子破了最管用
  中新网吕梁1月23日电 题:“最美基层民警”武文斌:案子破了最管用  作者 高瑞峰  同事称他为“拼命三郎”。从警14年,武文斌破
2022-01-24
  据“西安发布”消息,截至2022年1月23日,雁塔区长延堡街道近14天内无新增本地病例和聚集性疫情。根据国务院联防联控机制关于分区分级
2022-01-24
  中新网西宁1月23日电 (记者 孙睿)据青海省地震台网测定,2022年1月23日10点21分(北京时间)在青海省海西州德令哈市(北纬38 44度,东经
2022-01-24
江西南昌:市民赏年画迎新年 书法家挥毫送春联
  (新春见闻)江西南昌:市民赏年画迎新年 书法家挥毫送春联  1月23日,“赏年画过大年”新年画作品联展江西南昌站活动在江西省文化馆
2022-01-24
  中新网成都1月23日电 (祝欢)成都市第十七届人民代表大会第六次会议23日在成都举行,成都市中级人民法院院长郭彦与成都市人民检察院检
2022-01-24
列车临时停车3分钟救旅客
  (新春见闻)列车临时停车3分钟救旅客  中新网广州1月23日电 (郭军 黄伟伟)“车长,车长,4号车厢有位旅客腹涨难忍,身体不舒服”…
2022-01-24
女子背负命案潜逃24年 因涉疫人员核查落网
  中新网湖州1月23日电(施紫楠 徐盛煜 赵学良)1998年7月,犯罪嫌疑人杜某因家庭琐事,用菜刀将自己的弟媳砍伤致死。案发后,她从老家河
2022-01-24
广东“00后”雄狮少年锤炼功夫迎新春
  (新春见闻)广东“00后”雄狮少年锤炼功夫迎新春  中新社广州1月23日电 题:广东“00后”雄狮少年锤炼功夫迎新春  作者 孙秋霞 
2022-01-24
03-19 2022岳阳国际旅游节开幕 特色农产品展销等系列活动目不暇接
2022岳阳国际旅游节开幕 特色农产品展销等系列活动目不暇接
今天,天下洞庭岳阳市君山区第九届良心堡油菜花节暨2022岳阳国际旅游节开幕,菊红、粉红、水红、桃红、紫色、白色等七色组成的4万亩花海在 [详细]
03-19 2022年郴州计划重点推进文旅项目101个 总投资354亿元
2022年郴州计划重点推进文旅项目101个 总投资354亿元
3月16日,我市举行全市文旅项目和城市大提质大融城项目集中开工仪式,市委书记吴巨培宣布项目开工。郴州嘉合欢乐世界、仙福路工地清风徐来 [详细]
03-19 宿州泗县深入推进文旅融合发展 擦亮城市品牌
宿州泗县深入推进文旅融合发展 擦亮城市品牌
近年来,泗县以争创安徽省文化旅游名县为目标,深入推进文旅融合发展,努力擦亮水韵泗州 运河名城城市品牌,全县文化旅游业实现高质量发展 [详细]
03-19 淡季不忘引流 京郊民宿市场有望迎来回暖
淡季不忘引流 京郊民宿市场有望迎来回暖
旅游淡季中的京郊民宿有望成为市场中最先复苏的板块。3月17日,北京商报记者调查发现,虽然正值旅游淡季,且受疫情变化的影响,不过各家民 [详细]
01-24 西安浐灞回应“社区领导怒怼咨询群众”:涉事社区主任已停职
西安浐灞回应“社区领导怒怼咨询群众”:涉事社区主任已停职
  西安浐灞回应“一社区领导在市民咨询离市政策时发生争执”事件 涉事社区主任已停职  西部网讯(记者 刘望)日前,网络上流传一条视频 [详细]
01-24 宁夏:“草根主播”把货卖 “线上赶集”年味浓
宁夏:“草根主播”把货卖 “线上赶集”年味浓
  (新春走基层)宁夏:“草根主播”把货卖 “线上赶集”年味浓  中新网宁夏红寺堡1月23日电 题:宁夏:“草根主播”把货卖 “线上赶 [详细]
01-24 西安:整区解封前24小时内进行不漏一人的全员核酸检测
西安:整区解封前24小时内进行不漏一人的全员核酸检测
  1月23日15时,陕西省政府新闻办公室举行陕西省新冠肺炎疫情防控工作第四十五场新闻发布会。陕西省卫生健康委员会党组成员、省中医药管 [详细]