当前位置: 首页 > Web前端 > HTML5

在Phaser3中使用纹理集创建动画

时间:2023-04-05 15:27:31 HTML5

我前几天才开始学习phaser。看完教程,我第一个想做的就是做一个动画效果,但是刚迈出第一步就踩坑了??,记录一下吧。创建纹理集这里我使用TexturePacker将准备好的材质生成Phaser3支持的纹理集。TexturePacker使用起来非常简单。官网上有教程。我不会在这里详细介绍。我通过TexturePacker获取到了火焰纹理集,在json文件中记录了一个json文件,都是关于纹理集中每一帧的位置、大小等信息。看不懂也没关系。幸运的是,Phaser会帮助我们分析和绘制火焰。先在preload方法中加载资源//读取assets/sprites/fire.json文件,命名为fire,第三个参数为图片路径this.load.multiatlas('fire','assets/sprites/fire.json','assets/sprites')然后将加载的纹理添加到create方法中//场景中的三个参数分别是精灵的x坐标,y坐标和纹理键值,对应第一个上面multiatlas()的参数。constfire=this.add.sprite(400,100,'fire')这会将纹理集的第一帧绘制到屏幕上,非常容易。但是火焰不燃烧还好,然后你就得让它燃烧。创建动画也很简单,在创建方法中添加如下代码constframes=this.anims.generateFrameNames('fire',{start:0,end:14})console.log(frames)this.anims.create({key:'burn',frames,repeat:-1})回到浏览器,发现火焰还是一动不动。别着急,让我们看看这些参数是什么。Key:正如这个动画的名称frames:生成动画帧数据repeat:动画播放的次数,-1为无限循环。这里可以看出frames这个参数比较特殊。它是由this.anims的另一种方法生成的。这就是我踩坑的地方。根据API文档,该方法的两个参数分别是texturekey和动画帧名的配置,所以点击继续查看第二个参数的配置属性,可以看到有7个属性。start:startend:endprefix:prefixsuffix:suffixzeroPad:supplement0outputArray:输出数组,可以将生成的动画帧数据push到这个数组中frames:帧数数组这是我刚才看到的理解,根据文档,start、end和frames是互斥的,如果传入frames则start和end无效。由于文档中的描述含糊不清(英文渣),而且都是可选参数,我为了省事只写了start和end参数,从0写到14,结果浏览器无情的报错给我。代码中未引用frame属性。看来是Phaser的runtimeerrors没有处理好,此时打印出来的frames是一个空数组。由于国内Phaser资源匮乏,找了很多也没有找到相关解决方案,怎么办?查看源代码。我在phaser/src/animations/AnimationManager.js路径下找到了generateFrameNames方法generateFrameNames:function(key,config){varprefix=GetValue(config,'prefix','');varstart=GetValue(config,'start',0);varend=GetValue(config,'end',0);varsuffix=GetValue(config,'后缀','');varzeroPad=GetValue(config,'zeroPad',0);varout=GetValue(config,'outputArray',[]);varframes=GetValue(config,'frames',false);vartexture=this.textureManager.get(key);如果(!纹理){返回;}vardiff=(开始<结束)?1:-1;//调整,因为我们在for循环中使用i!==endend+=diff;变量我;可变帧;if(!config){//使用图集中的每一帧?frames=texture.getFrameNames();for(i=0;i