一起学 pixijs(三):Sprite

开发 前端
Sprite 直译为 “精灵”,是游戏开发中常见的术语,就是将一个角色的多个动作放到一个图片里,通过裁剪局部区域得到当前的角色状态图。

大家好,我是前端西瓜哥。今天来学习 pixijs 的 Sprite。

Sprite

pixijs 的 Sprite 类用于将一些纹理(Texture)渲染到屏幕上。

Sprite 直译为 “精灵”,是游戏开发中常见的术语,就是将一个角色的多个动作放到一个图片里,通过裁剪局部区域得到当前的角色状态图。

Sprite 的纹理通常为图片。

创建 Sprite 不用 new 关键字,而是用 PIXI.Sprite.from(url) ,传一个图片地址字符串。

const watermelon = PIXI.Sprite.from('./fe_watermelon.jpg');
watermelon.x = 50;
watermelon.y = 50;
app.stage.addChild(watermelon);

加载图片是异步的,如果图片较大,或网速不好,加载完成的时机就会比较晚了。

加载慢,其他不需要加载的普通图形(比如矩形)才不会等你,会先绘制。然后等到图片加载好后,再更新图形树绘制新的画面。

模拟网速慢,导致图片加载迟缓的效果:

图片

一些属性

tint

tint (大概是 “色相” 的意思)会给图片着色:

img.tint = 0x00FF00;

可以看到,西瓜变得更绿了。

图片

这在游戏中可以利用绿色的 tint 表示角色中毒,或者用灰色的 tint 表示天色已晚。

blendMode

然后是渲染模式 blendMode,目前只支持 4 种(基于 WebGL):

  • NORMAL:正常,即没有滤镜效果。
  • ADD:给下面的像素叠加 RGB 通道。
  • MULTIPLY:正片叠底,效果是:像是很多张幻灯片叠在一起,因为密度大导致颜色加深。
  • SCREEN:滤色,效果是发亮。

anchor

上一节讲解 “修改图形属性” 时,我们提到了通过 pivot 修改变形(transform)的中心,但对于 Sprite 来说,额外提供了一个特殊的 anchor 属性。

这个属性的值范围为 0~1,表示相对图片宽高位置的百分比,比如设置为 (0.5, 0.5) 就是取宽高一半的位置作为旋转中心,也就是图片的中点。

img.anchor.set(x, y);

SpriteSheet

SpriteSheet 是管理多个 Sprite 的类,就是前面说的将多个角色的状态放在一起。

优点是:

  1. 加快加载速度:因为多个 sprit 放在一个图片上了。
  2. 提高批渲染效率:pixijs 快的秘诀是使用尽量少的 draw call(CPU 通知 GPU 绘制,比 GPU 绘制还耗时),将多个 sprite 放在一起有助于批渲染。
const atlasData = {
// 如何裁剪图片中的内容来生成多个 sprite
frames: {
enemy1: {
frame: { x: 0, y: 0, w: 32, h: 32 },
sourceSize: { w: 32, h: 32 },
spriteSourceSize: { x: 0, y: 0, w: 32, h: 32 },
},
enemy2: {
frame: { x: 32, y: 0, w: 32, h: 32 },
sourceSize: { w: 32, h: 32 },
spriteSourceSize: { x: 0, y: 0, w: 32, h: 32 },
},
},
// 图片元信息
meta: {
image: "images/spritesheet.png",
format: "RGBA8888",
size: { w: 128, h: 32 },
scale: 1,
},
// 如果使用动画,动画帧对应的 sprit
animations: {
enemy: ["enemy1", "enemy2"],
},
};

// 创建 spritesheet
const spritesheet = new PIXI.Spritesheet(
PIXI.BaseTexture.from(atlasData.meta.image),
atlasData
);

// 生成材质,这是异步的
await spritesheet.parse();

// 播放动画
const anim = new PIXI.AnimatedSprite(spritesheet.animations.enemy);
anim.animationSpeed = 0.1666;
anim.play();
app.stage.addChild(anim);


责任编辑:姜华 来源: 前端西瓜哥
相关推荐

2023-03-02 07:44:39

pixijsWebGL

2023-02-23 08:40:09

Pixijs修改图形属性

2023-02-22 09:27:31

CanvasWebGL

2022-12-02 14:20:09

Tetris鸿蒙

2022-11-29 16:35:02

Tetris鸿蒙

2023-03-30 09:32:27

2022-11-14 17:01:34

游戏开发画布功能

2024-02-28 12:12:20

Pipeline数据机制

2023-11-13 22:27:53

Mapping数据库

2023-04-12 07:46:24

JavaScriptWebGL

2023-11-30 15:23:07

聚合查询数据分析

2023-11-13 12:48:32

语言DSL

2023-03-29 07:31:09

WebGL坐标系

2023-04-17 09:01:01

WebGL绘制三角形

2022-02-08 14:35:36

分片集群数据库mongo

2023-06-26 15:14:19

WebGL纹理对象学习

2023-05-04 08:48:42

WebGL复合矩阵

2023-04-26 07:42:16

WebGL图元的类型

2023-05-08 07:29:48

WebGL视图矩阵

2023-04-13 07:45:15

WebGL片元着色器
点赞
收藏

51CTO技术栈公众号