@animech-public/playcanvas
Version:
PlayCanvas WebGL game engine
2 lines (1 loc) • 5.58 kB
JavaScript
import{EventHandler as t}from"../../../core/event-handler.js";import{math as s}from"../../../core/math/math.js";import{Asset as e}from"../../asset/asset.js";import{SPRITE_RENDERMODE_SIMPLE as i}from"../../../scene/constants.js";class h extends t{constructor(t,s){super(),this._evtSetMeshes=null,this._component=t,this._frame=0,this._sprite=null,this._spriteAsset=null,this.spriteAsset=s.spriteAsset,this.name=s.name,this.fps=s.fps||0,this.loop=s.loop||!1,this._playing=!1,this._paused=!1,this._time=0}get duration(){if(this._sprite){const t=this.fps||Number.MIN_VALUE;return this._sprite.frameKeys.length/Math.abs(t)}return 0}set frame(t){this._setFrame(t);const s=this.fps||Number.MIN_VALUE;this._setTime(this._frame/s)}get frame(){return this._frame}get isPaused(){return this._paused}get isPlaying(){return this._playing}set sprite(t){var s;this._sprite&&(null==(s=this._evtSetMeshes)||s.off(),this._evtSetMeshes=null,this._sprite.off("set:pixelsPerUnit",this._onSpritePpuChanged,this),this._sprite.off("set:atlas",this._onSpriteMeshesChange,this),this._sprite.atlas&&this._sprite.atlas.off("set:texture",this._onSpriteMeshesChange,this));if(this._sprite=t,this._sprite&&(this._evtSetMeshes=this._sprite.on("set:meshes",this._onSpriteMeshesChange,this),this._sprite.on("set:pixelsPerUnit",this._onSpritePpuChanged,this),this._sprite.on("set:atlas",this._onSpriteMeshesChange,this),this._sprite.atlas&&this._sprite.atlas.on("set:texture",this._onSpriteMeshesChange,this)),this._component.currentClip===this){let s;t&&t.atlas?(t.atlas.texture&&(s=this._component._meshInstance,s&&(s.setParameter("texture_emissiveMap",t.atlas.texture),s.setParameter("texture_opacityMap",t.atlas.texture)),this._component.enabled&&this._component.entity.enabled&&this._component._showModel()),this.time&&this.fps?this.time=this.time:this.frame=this.frame):(s=this._component._meshInstance,s&&(s.deleteParameter("texture_emissiveMap"),s.deleteParameter("texture_opacityMap")),this._component._hideModel())}}get sprite(){return this._sprite}set spriteAsset(t){const s=this._component.system.app.assets;let i=t;if(t instanceof e&&(i=t.id),this._spriteAsset!==i){if(this._spriteAsset){const t=s.get(this._spriteAsset);t&&this._unbindSpriteAsset(t)}if(this._spriteAsset=i,this._spriteAsset){const t=s.get(this._spriteAsset);t?this._bindSpriteAsset(t):(this.sprite=null,s.on(`add:${this._spriteAsset}`,this._onSpriteAssetAdded,this))}else this.sprite=null}}get spriteAsset(){return this._spriteAsset}set time(t){this._setTime(t),this._sprite?this.frame=Math.min(this._sprite.frameKeys.length-1,Math.floor(this._time*Math.abs(this.fps))):this.frame=0}get time(){return this._time}_onSpriteAssetAdded(t){this._component.system.app.assets.off(`add:${t.id}`,this._onSpriteAssetAdded,this),this._spriteAsset===t.id&&this._bindSpriteAsset(t)}_bindSpriteAsset(t){t.on("load",this._onSpriteAssetLoad,this),t.on("remove",this._onSpriteAssetRemove,this),t.resource?this._onSpriteAssetLoad(t):this._component.system.app.assets.load(t)}_unbindSpriteAsset(t){t&&(t.off("load",this._onSpriteAssetLoad,this),t.off("remove",this._onSpriteAssetRemove,this),t.resource&&!t.resource.atlas&&this._component.system.app.assets.off(`load:${t.data.textureAtlasAsset}`,this._onTextureAtlasLoad,this))}_onSpriteAssetLoad(t){if(t.resource)if(t.resource.atlas)this.sprite=t.resource;else{const s=t.data.textureAtlasAsset,e=this._component.system.app.assets;e.off(`load:${s}`,this._onTextureAtlasLoad,this),e.once(`load:${s}`,this._onTextureAtlasLoad,this)}else this.sprite=null}_onTextureAtlasLoad(t){const s=this._spriteAsset;s instanceof e?this._onSpriteAssetLoad(s):this._onSpriteAssetLoad(this._component.system.app.assets.get(s))}_onSpriteAssetRemove(t){this.sprite=null}_onSpriteMeshesChange(){this._component.currentClip===this&&this._component._showFrame(this.frame)}_onSpritePpuChanged(){this._component.currentClip===this&&this.sprite.renderMode!==i&&this._component._showFrame(this.frame)}_update(t){if(0===this.fps)return;if(!this._playing||this._paused||!this._sprite)return;const s=this.fps<0?-1:1,e=this._time+t*this._component.speed*s,i=this.duration,h=e>i||e<0;this._setTime(e);let r=this.frame;r=this._sprite?Math.floor(this._sprite.frameKeys.length*this._time/i):0,r!==this._frame&&this._setFrame(r),h&&(this.loop?(this.fire("loop"),this._component.fire("loop",this)):(this._playing=!1,this._paused=!1,this.fire("end"),this._component.fire("end",this)))}_setTime(t){this._time=t;const s=this.duration;this._time<0?this.loop?this._time=this._time%s+s:this._time=0:this._time>s&&(this.loop?this._time%=s:this._time=s)}_setFrame(t){this._sprite?this._frame=s.clamp(t,0,this._sprite.frameKeys.length-1):this._frame=t,this._component.currentClip===this&&this._component._showFrame(this._frame)}_destroy(){if(this._spriteAsset){const t=this._component.system.app.assets;this._unbindSpriteAsset(t.get(this._spriteAsset))}this._sprite&&(this.sprite=null),this._spriteAsset&&(this.spriteAsset=null)}play(){this._playing||(this._playing=!0,this._paused=!1,this.frame=0,this.fire("play"),this._component.fire("play",this))}pause(){this._playing&&!this._paused&&(this._paused=!0,this.fire("pause"),this._component.fire("pause",this))}resume(){this._paused&&(this._paused=!1,this.fire("resume"),this._component.fire("resume",this))}stop(){this._playing&&(this._playing=!1,this._paused=!1,this._time=0,this.frame=0,this.fire("stop"),this._component.fire("stop",this))}}h.EVENT_PLAY="play",h.EVENT_PAUSE="pause",h.EVENT_RESUME="resume",h.EVENT_STOP="stop",h.EVENT_END="end",h.EVENT_LOOP="loop";export{h as SpriteAnimationClip};