当前位置 : 主页 > 网络编程 > JavaScript >

PixiJS学习之Sprite类的使用详解

来源:互联网 收集:自由互联 发布时间:2023-03-22
目录 Sprite 一些属性 tint blendMode anchor SpriteSheet Sprite pixijs 的 Sprite 类用于将一些纹理(Texture)渲染到屏幕上。 Sprite 直译为 精灵,是游戏开发中常见的术语,就是将一个角色的多个动作
目录
  • Sprite
  • 一些属性
    • tint
    • blendMode
    • anchor
  • SpriteSheet

    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 的类,就是前面说的将多个角色的状态放在一起。

    优点是:

    • 加快加载速度:因为多个 sprit 放在一个图片上了;
    • 提高批渲染效率: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);
    

    到此这篇关于PixiJS学习之Sprite类的使用详解的文章就介绍到这了,更多相关PixiJS Sprite类内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

    上一篇:JavaScript中?. 和??分别是什么详解
    下一篇:没有了
    网友评论