:::success
为此系列创建的库
https://github.com/taoya7/learn-pixi.js
在线访问
https://taoya-pixi.netlify.app/
版本号: 6.0.4 :::
PixiJS是一个2D轻量的渲染引擎,可以创建丰富的交互式图形,动画和游戏,而无需深入了解WebGL API或处理浏览器和设备兼容性的问题。与此同时,PixiJS具有完整的WebGL支持,如果需要,可以无缝地回退到HTML5的canvas。PixiJs默认使用WebGL渲染,也可以通过声明指定canvas渲染,WebGL在移动端Android 4.4 browser并不支持,不过可以使用canvas优雅降级。
- 支持
WebGL渲染,
使用 Pixi 绘制的图形是通过 WebGL 在 GPU 上渲染 - 非常简单易用的
API
,一切都是对象。 - 提供了一个完备的场景图,你可以在精灵图层里面创建另一个精灵。
- 丰富的交互事件,比如完整的鼠标和移动端的触控事件。
要注意的是,虽然 PixiJS 非常适合制作小游戏,但它并不是一个游戏引擎,它的核心本质是尽可能快速有效地在屏幕上移动物体。这个库经常被用来制作HTML5游戏(微信小游戏)以及有复杂交互的H5活动页。
Pixi.js的定位就是只做渲染器,要把渲染功能做到最强。而这样的定位,则会让Pixi.js成为其他引擎的渲染内核。Pixi.js中的显示架构完全类似于我们的dom,将显示对象组合为一个树状结构,内部已针对WebGL渲染方式进行过优化,使上层使用起来无需关系渲染层的东西。
:::warning
Github - 33.8k
https://github.com/pixijs/pixijs
官网
https://www.pixijs.com/
文档
http://pixijs.download/release/docs/PIXI.Application.html
:::
npm i pixi.js
import * as PIXI from 'pixi.js';
应用场景
- 前端动效
- 小游戏
- 自定义渲染器
判断浏览器渲染引擎
const type = PIXI.utils.isWebGLSupported() ? "WebGL" : "canvas";
创建一个应用
- 创建舞台
- 创建画布
- 画布添加到DOM
- 创建精灵
- 精灵添加到画布
- 画布添加舞台
- 刷新舞台
核心概念
Pixi 精灵
现在你就有了一个画布,可以开始往上面放图像了。所有你想在画布上显示的东西必须被加进一个被称作 舞台
的Pixi对象中。你能够像这样使用舞台对象:
app.stage
这个舞台
是一个Pixi 容器
对象。你能把它理解成一种将放进去的东西分组并存储的空箱子。 舞台
对象是在你的场景中所有可见对象的根容器。所有你放进去的东西都会被渲染到canvas中。
应用 Application
PIXI拥有一个Pixi应用对象PIXI.Application
,可自动创建一个canvas
标签,用于计算图片在其中的显示。PIXI.Application
会自动创建渲染器、计时器和根容器。
Container
Renderer
Sprite
Sprite精灵是可以放在容器里的交互式图像。精灵是你能用代码控制图像的基础。你能够控制他们的位置,大小,和许多其他有用的属性来产生交互和动画。 创建一个精灵需要用 PIXI.Sprite() 方法。
const avatar = new Sprite.from('avatar.jpg');
// 和普通的图形一样可以设置各种属性
avatar.width = 100;
avatar.height = 200;
avatar.position.set(20, 30);
avatar.scale.set(2, 2);
Loader
加载图片通常需要耗费一定的时间,因此我们常常使用Loader来预加载图片,当图片全部加载成功后,才渲染出来。
sprite 具有zIndex属性,当容器的sortableChildren属性为true时容器中的所有子元素按照zIndex大小排序。
import { Application, Sprite, Loader } from 'pixi.js';
const loader = Loader.shared;// Loader.shared内置的单例loader
const loader = new Loader();// 也可以使用自定义的loader
const app = new Application({
width: 300,
height: 300,
antialias: true,
transparent: false,
resolution: 1,
backgroundColor: 0x1d9ce0
});
document.body.appendChild(app.view);
loader
.add('bili', 'http://pic.deepred5.com/bilibili.jpg')
.add('avatar', 'http://anata.me/img/avatar.jpg')
.load(setup)
// 监听加载事件
loader.onProgress.add((loader) => {
console.log(loader.progress);
});
// 启动函数setup
function setup() {
const bili = new Sprite(
loader.resources["bili"].texture
);
bili.width = 50;
bili.height = 50;
const avatar = new Sprite(
loader.resources["avatar"].texture
);
avatar.width = 50;
avatar.height = 50;
avatar.position.set(50, 50);
app.stage.addChild(bili);
app.stage.addChild(avatar);
}
通过add方法添加需要加载的图片,所有图片加载完成后,load方法会调用传入的setup回调函数,这时就可以把图片精灵加入到app.stage里。onProgress事件可以监听加载的进度,通过这个方法,可以很方便的制作进度条动画。
Texture
Ticker
容器 Container()
容器是用来转载多个显示对象的,创建的Pixi应用的stage属性本质上就是一个容器对象,stage对象被当作根容器使用,它将包裹所有想用Pixi显示的元素。
let container = new PIXI.Container();
container.addChild(sprite);
Ticker 帧率更新函数
Ticker
有点类似前端的requestAnimationFrame
,当浏览器的显示频率刷新的时候,此函数会被执行,因此常常用来制作帧动画。app.ticker
就是一个Ticker
实例。
几何图形
graphics主要用于绘制原始形状(如线条,圆形和矩形)以及他们的上色和填充。
const graphics = new PIXI.Graphics()
// 线框
graphics.lineStyle(2, 0x0000FF, 1) graphics.drawRect(50, 250, 100, 100)
// 四边形
graphics.drawRect(50, 50, 100, 100)
// 圆形
graphics.drawCircle(100, 250, 50)
// 椭圆
graphics.drawEllipse(600, 250, 80, 50)
// 圆角矩形
graphics.drawRoundedRect(50, 440, 100, 100, 16)
// 星星
graphics.drawStar(360, 370, 5, 50)
// 多边形
graphics.drawPolygon(path)
// 贝塞尔曲线
graphics.bezierCurveTo(100, 240, 200, 200, 240, 100)
// 圆弧
graphics.arc(300, 100, 50, Math.PI, 2 * Math.PI)
app.stage.addChild(graphics)
:::success 清除图形 用graphics.clear()方法 :::
绘制文字
// 基础文字
const basicText = new PIXI.Text('6666666')
// 自定义文字样式
const style = new PIXI.TextStyle({
fontFamily: 'Arial',
fontSize: 36,
fontStyle: 'italic',
fontWeight: 'bold',
fill: ['#ffffff', '#00ff99'],
stroke: '#4a1850',
strokeThickness: 5,
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6,
wordWrap: true,
wordWrapWidth: 440
})
const richText = new PIXI.Text('6666666', style)
app.stage.addChild(richText)
交互
pixi.js中的事件交互可同时兼容移动端和pc端,在绑定事件之前需要开启交互模式
graphics.interactive = true
在pc端需要出现cursor: pointer
的效果
graphics.buttonMode = true
补间动画
Ticker
可以实现简单的动画,但如果我们希望实现一些复杂效果,则需要自己编写很多代码,这时就可以选择一个兼容pixi
的动画库。市面上比较常见的动画库有:Tween.js,TweenMax
npm i gsap
import * as PIXI from 'pixi.js';
import gsap from 'gsap';
export default {
mounted(){
const app = new PIXI.Application({
width:300,
height: 300,
antialias: true, // antialias使得字体的边界和几何图形更加圆滑
transparent: false, // transparent将整个Canvas标签的透明度进行了设置
resolution: 1, // resolution让Pixi在不同的分辨率和像素密度的平台上运行变得简单
backgroundColor: 0x1d9ce0
});
let circle = new PIXI.Graphics();
circle.beginFill(0x9966FF);
circle.drawCircle(0,0, 32);
circle.endFill();
circle.x = 32;
circle.y = 32;
app.stage.addChild(circle);
let tl = gsap.timeline({
repeat: -1,
yoyo: true,
});
tl.to(circle, {
x: 200,
y: 32
}).to(circle, {
x: 200,
y: 232
}).to(circle, {
x: 32,
y: 232
}).to(circle, {
x: 32,
y: 32,
})
this.$refs.box.appendChild(app.view);
}
}
参考
https://blog.csdn.net/tianshan2010/article/details/106322191