进修 PixiJS — 动画精灵

申明

看完官方教程中提到的这本书 — Learn Pixi.js ,预备写写读后感了,官方教程中所说的内容,基础上就是书的前4章,所以我就从第5章最先写写吧。

动画精灵指的是按递次运用一系列略有不同的图象,建立的精灵,以后一帧一帧的播放这些图象,就能够发生活动的幻觉。

也就是说用这类图片

《进修 PixiJS — 动画精灵》

做出如许的结果
《进修 PixiJS — 动画精灵》

要制造动画精灵我们须要用到 PixiJSAnimatedSprite 要领。

PIXI.extras.AnimatedSprite

定义:

运用纹理数组建立动画精灵的要领。

用法:

new PIXI.extras.AnimatedSprite(textures,autoUpdate)

参数 :

称号范例默认值形貌
texturesarray用一系列略有不同的图象做的纹理数组。
autoUpdatebooleantrue用来推断是不是运用 PIXI.ticker.shared 自动更新动画时刻。

返回值:
返回一个对象,对象会有一些属性和要领,用于掌握动画精灵。

返回值对象的属性:

称号范例形貌
animationSpeednumber动画精灵的播放速率。越高越快,越低越慢,默认值是1
currentFramenumber(只读)正在显现的当前帧编号
onCompletefunctionloop属性为false时,一个动画精灵完成播放时挪用
playingBoolean肯定当前动画精灵是不是正在播放
onFrameChangefunction当一个动画精灵更改要显现的纹理时挪用
loopboolean动画精灵是不是在播放后反复播放
onLoopfunctionloop属性为true时挪用的函数
texturesarray用于这个动画精灵的纹理数组
totalFramesnumber (只读)动画中的帧总数

返回值对象的要领:

称号参数形貌
play播放动画精灵
gotoAndPlay frameNumber,number范例,最先帧的索引转到特定的帧并最先播放动画精灵
stop住手播放动画精灵
gotoAndStop frameNumber,number范例,住手帧的索引转到特定的帧并住手播放动画精灵

运用返回值中的这些属性和要领,我们就能够掌握动画精灵了,比方播放动画精灵,设置动画的速率,设置是不是轮回播放等,除此之外,还要晓得就是 PIXI.extras.AnimatedSprite 要领继续自 PIXI.Sprite 要领,所以动画精灵也能够用一般精灵的属性和要领,比方xywidthheightscalerotation

好的,我们最先尝尝这个要领。

<!doctype html>
<html lang="zn">

<head>
    <meta charset="UTF-8">
    <title>动画精灵</title>
</head>

<body>
    <div id="px-render"></div>

    <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <script>
        // 建立一个 Pixi运用 须要的一些参数
        let option = {
            width: 400,
            height: 300,
            transparent: true,
        }
        // 建立一个 Pixi运用
        let app = new PIXI.Application(option);
        // 猎取渲染器
        let renderer = app.renderer;
        let playground = document.getElementById('px-render');
        // 把 Pixi 建立的 canvas 添加到页面上
        playground.appendChild(renderer.view); 

        //设置别号
        let TextureCache = PIXI.utils.TextureCache;
        let Texture = PIXI.Texture;
        let Rectangle = PIXI.Rectangle;
        let AnimatedSprite = PIXI.extras.AnimatedSprite;

        //须要加载的雪碧图的地点(该图片服务器端已做跨域处置惩罚)
        let imgURL = "https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png";
 
        //加载图象,加载完成后实行setup函数 
        PIXI.loader.add(imgURL).load(setup);
        
        function setup() {  
            //猎取纹理
            let base = TextureCache[imgURL];
            
            //第一个纹理
            let texture0 = new Texture(base);
            texture0.frame = new Rectangle(0, 0, 80, 143);
            //第二个纹理
            let texture1 = new Texture(base);
            texture1.frame = new Rectangle(80, 0, 80, 143);
            //第三个纹理
            let texture2 = new Texture(base);
            texture2.frame = new Rectangle(160, 0, 80, 143);
            //第四个纹理
            let texture3 = new Texture(base);
            texture3.frame = new Rectangle(240, 0, 80, 143);

            //建立纹理数组
            let textures = [texture0, texture1, texture2,texture3];
            //建立动画精灵
            let pixie = new PIXI.extras.AnimatedSprite(textures); 
            //设置动画精灵的速率
            pixie.animationSpeed=0.1;
            
            //把动画精灵添加到舞台
            app.stage.addChild(pixie);
            //播放动画精灵
            pixie.play();
        }
    </script>
</body>

</html>

检察结果

上面这个例子中,建立纹理数组时好像点贫苦,要处理这个题目,我们能够用名叫 SpriteUtilities 的库,该库包括很多有效的函数,用于建立Pixi精灵并使它们更易于运用。

装置:

直接用 script 标签,引入js 文件就能够

<script src="https://www.kkkk1000.com/js/spriteUtilities.js"></script>

装置好以后,我们须要建立一个新实例,代码以下

let su = new SpriteUtilities(PIXI);

以后就能够用 su 对象接见一切要领了。

我们这里须要用到的就是 su 对象的 filmstrip 要领。

定义:

filmstrip 要领能够自动将雪碧图转换为可用于制造精灵的纹理数组

用法:

su.filmstrip("anyTilesetImage.png", frameWidth, frameHeight, optionalPadding);

参数:

称号范例形貌
anyTilesetImagestring雪碧图的途径
frameWidthnumber每帧的宽度(以像素为单元)
frameHeightnumber每帧的高度(以像素为单元)
optionalPaddingnumber每帧四周的添补量(可选值,以像素为单元)

返回值:

返回一个数组,可用于制造动画精灵的纹理数组。

如今我们运用 SpriteUtilities 来改写下适才的示例代码。

<!doctype html>
<html lang="zn">

<head>
    <meta charset="UTF-8">
    <title>动画精灵</title>
</head>

<body>
    <div id="px-render"></div> 

    <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <script src="https://www.kkkk1000.com/js/spriteUtilities.js"></script>
    <script>
        //建立一个 Pixi运用 须要的一些参数
        let option = {
            width: 400,
            height: 300,
            transparent: true,
        }
        //建立一个 Pixi运用
        let app = new PIXI.Application(option);
        //猎取渲染器
        let renderer = app.renderer;
        let playground = document.getElementById('px-render');
        //把 Pixi 建立的 canvas 添加到页面上
        playground.appendChild(renderer.view);
         
        let su = new SpriteUtilities(PIXI);
        //须要加载的雪碧图的地点(该图片服务器端已做跨域处置惩罚)
        let imgURL = "https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png";
        PIXI.loader.add(imgURL).load(setup); 
        
        function setup() { 
            //建立纹理数组
            let frames = su.filmstrip(imgURL, 80, 143);
            //建立动画精灵
            let pixie = new PIXI.extras.AnimatedSprite(frames);
            //设置动画精灵的速率
            pixie.animationSpeed=0.1;

            //把动画精灵添加到舞台
            app.stage.addChild(pixie);
            //播放动画精灵
            pixie.play();
        }
    </script>
</body>

</html>

检察结果

filmstrip 要领自动将全部雪碧图转换为可用于制造动画精灵的纹理数组。然则,假如我们只想运用雪碧图中的一部分帧呢?这时刻须要用到 frames 要领了。

定义:
frames 要领运用雪碧图中的一组子帧,来建立纹理数组。

用法:

su.frames(source, coordinates, frameWidth, frameHeight)

参数:

称号范例形貌
sourcestring雪碧图的途径
coordinatesarray包括每帧的 x 和 y 坐标的二维数组
frameWidthnumber每帧的宽度(以像素为单元)
frameHeightnumber每帧和高度(以像素为单元)

返回值:
返回一个数组,可用于制造动画精灵的纹理数组。

示例代码:

<!doctype html>
<html lang="zn">

<head>
    <meta charset="UTF-8">
    <title>动画精灵</title>
</head>

<body>
    <div id="px-render"></div>

    <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <script src="https://www.kkkk1000.com/js/spriteUtilities.js"></script>
    <script>
        //建立一个 Pixi运用 须要的一些参数
        let option = {
            width: 400,
            height: 300,
            transparent: true,
        }
        //建立一个 Pixi运用
        let app = new PIXI.Application(option);
        //猎取渲染器
        let renderer = app.renderer;
        let playground = document.getElementById('px-render');
        //把 Pixi 建立的 canvas 添加到页面上
        playground.appendChild(renderer.view);
         
        let su = new SpriteUtilities(PIXI);
        //须要加载的雪碧图的地点(该图片服务器端已做跨域处置惩罚)
        let imgURL = "https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.png";

        PIXI.loader.add(imgURL).load(setup); 
        function setup() { 
            //建立纹理数组
            let frames = su.frames(imgURL, [[0,0],[80,0],[160,0],[240,0]],80, 143);
            //建立动画精灵
            let pixie = new PIXI.extras.AnimatedSprite(frames);
            //设置动画精灵的速率
            pixie.animationSpeed=0.1;

            //把动画精灵添加到舞台
            app.stage.addChild(pixie);
            //播放动画精灵
            pixie.play();
        }
    </script>
</body>

</html>

检察结果

除了上面提到的体式格局,还能够用纹理贴图集来建立动画精灵。

运用纹理贴图集来建立动画精灵,就是先经由过程json文件,加载一切纹理,然后把须要的纹理再放进一个数组中,末了把这个数组当参数,传入PIXI.extras.AnimatedSprite 要领中,来建立动画精灵。

代码:

<!doctype html>
<html lang="zn">

<head>
    <meta charset="UTF-8">
    <title>动画精灵</title>
</head>

<body>
    <div id="px-render"></div>

    <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <script>
        //建立一个 Pixi运用 须要的一些参数
        let option = {
            width: 400,
            height: 300,
            transparent: true,
        }
        //建立一个 Pixi运用
        let app = new PIXI.Application(option);
        //猎取渲染器
        let renderer = app.renderer;
        let playground = document.getElementById('px-render');
        //把 Pixi 建立的 canvas 添加到页面上
        playground.appendChild(renderer.view); 

        //须要加载的纹理贴图集的地点
        let textureURL = "https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.json";

        //加载纹理贴图集,加载完成后实行setup函数
        PIXI.loader.add(textureURL).load(setup);

        function setup() {  
            let id = PIXI.loader.resources[textureURL].textures;
                 
            //建立纹理数组
            let frames = [
             id["dnf0.png"],
             id["dnf1.png"],
             id["dnf2.png"],
             id["dnf3.png"]
            ];
            //建立动画精灵
            let pixie = new PIXI.extras.AnimatedSprite(frames);
            //设置动画精灵的速率
            pixie.animationSpeed=0.1;

            //把动画精灵添加到舞台
            app.stage.addChild(pixie);
            //播放动画精灵
            pixie.play();
        }
    </script>
</body>

</html>

检察结果

上面的代码建立纹理数组时,是把纹理一个一个的放进数组中,假如数目比较少还好,多一点呢?假如有100个呢?一个一个的放就太贫苦了,这时刻我们能够用 SpriteUtilities 库中供应的 frameSeries 要领。

定义:

frameSeries 要领能够经由过程已加载的纹理贴图集,运用一系列编号的帧ID来建立动画精灵。

用法:

su.frameSeries(startNumber, endNumber, baseName, extension)

参数:

称号范例形貌
startNumbernumber肇端帧序列号(默认值是0)
endNumbernumber完毕帧序列号(默认值是1)
baseNamestring可选的基础文件名
extensionstring可选的文件扩展名

返回值:
返回一个数组,可用于制造动画精灵的纹理数组。

注重:
运用 frameSeries 要领时,要确保在 json 文件中,定义的每帧的称号都是按递次来的,比方 frame0.png frame1.png frame2.png 这类。由于 frameSeries 要领的源码是如许写的

 frameSeries(startNumber = 0, endNumber = 1, baseName = "", extension = "") {
   //建立一个数组来存储帧名
   let frames = [];

   for (let i = startNumber; i < endNumber + 1; i++) {
     let frame = this.TextureCache[`${baseName + i + extension}`];
     frames.push(frame);
   }
   return frames;
 }

源码中实际上是用 for 轮回把帧名拼接起来的。所以要保证帧名是按递次来的,不然就猎取不到了。

下来我们就尝尝 frameSeries 要领吧。

<!doctype html>
<html lang="zn">

<head>
    <meta charset="UTF-8">
    <title>动画精灵</title>
</head>

<body>
    <div id="px-render"></div>

    <script src="https://www.kkkk1000.com/js/pixi4.8.2.js"></script>
    <script src="https://www.kkkk1000.com/js/spriteUtilities.js"></script>
    <script>
        //建立一个 Pixi运用 须要的一些参数
        let option = {
            width: 400,
            height: 300,
            transparent: true,
        }
        //建立一个 Pixi运用
        let app = new PIXI.Application(option);
        //猎取渲染器
        let renderer = app.renderer;
        let playground = document.getElementById('px-render');
        //把 Pixi 建立的 canvas 添加到页面上
        playground.appendChild(renderer.view);
         
        let su = new SpriteUtilities(PIXI);
        //须要加载的纹理贴图集的地点
        let textureURL = "https://www.kkkk1000.com/images/learnPixiJS-AnimatedSprite/dnf.json";

        PIXI.loader.add(textureURL).load(setup); 
        function setup() { 
            //建立纹理数组
            debugger;
            let frames = su.frameSeries(0,7,"dnf",".png"); 
            //建立动画精灵
            let pixie = new PIXI.extras.AnimatedSprite(frames);
            //设置动画精灵的速率
            pixie.animationSpeed=0.1;

            //把动画精灵添加到舞台
            app.stage.addChild(pixie);
            //播放动画精灵
            pixie.play();
        }
    </script>
</body>

</html>

检察结果

注重版本题目:
1、PIXI.extras.AnimatedSprite 这个要领本来叫PIXI.extras.MovieClip ,是在 4.2.1 版本的时刻修正的,本文示例代码顶用 PixiJS 的版本是 4.8.2,所以没有题目,假如你在运用过程中发明挪用PIXI.extras.AnimatedSprite 这个要领有题目,能够先搜检下版本是不是准确。

2、 SpriteUtilities 现在支撑的 PixiJS 的版本是 3.0.11,而 SpriteUtilities 顶用的就是PIXI.extras.MovieClip 要领,所以你假如用了比较高的 PixiJS 的版本,须要在SpriteUtilities 中修正下要领的别号。

spriteUtilities.js 文件中须要把 renderingEngine.extras.MovieClip 改成renderingEngine.extras.AnimatedSprite,把 renderingEngine.ParticleContainer 改成 PIXI.particles.ParticleContainer

这个 spriteUtilities.js 就是修正后的。

固然你也能够运用低版本的 PixiJS,如许就不必改 spriteUtilities.js 的代码了。

总结

动画精灵就是逐帧动画,经由过程一帧一帧的播放图象来发生活动的幻觉。

本文就是聊了聊建立动画精灵的一些体式格局和怎样运用动画精灵。

假如文中有毛病的处所,还请小伙伴们指出,万分谢谢。

下一篇 进修 PixiJS — 精灵状况

    原文作者:FEWY
    原文地址: https://segmentfault.com/a/1190000017877760
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞