diff --git a/extensions/dragonbones/ArmatureDisplay.js b/extensions/dragonbones/ArmatureDisplay.js index a3306952389..f50c5052700 100644 --- a/extensions/dragonbones/ArmatureDisplay.js +++ b/extensions/dragonbones/ArmatureDisplay.js @@ -521,6 +521,16 @@ let ArmatureDisplay = cc.Class({ } }, + _emitCacheCompleteEvent () { + // Animation loop complete, the event diffrent from dragonbones inner event, + // It has no event object. + this._eventTarget.emit(dragonBones.EventObject.LOOP_COMPLETE); + + // Animation complete the event diffrent from dragonbones inner event, + // It has no event object. + this._eventTarget.emit(dragonBones.EventObject.COMPLETE); + }, + update (dt) { if (!this.isAnimationCached()) return; if (!this._playing) return; @@ -532,7 +542,7 @@ let ArmatureDisplay = cc.Class({ // Animation Start, the event diffrent from dragonbones inner event, // It has no event object. if (this._accTime == 0 && this._playCount == 0) { - this._eventTarget && this._eventTarget.emit(dragonBones.EventObject.START); + this._eventTarget.emit(dragonBones.EventObject.START); } let globalTimeScale = dragonBones.timeScale; @@ -543,15 +553,6 @@ let ArmatureDisplay = cc.Class({ } if (frameCache.isCompleted && frameIdx >= frames.length) { - - // Animation loop complete, the event diffrent from dragonbones inner event, - // It has no event object. - this._eventTarget && this._eventTarget.emit(dragonBones.EventObject.LOOP_COMPLETE); - - // Animation complete the event diffrent from dragonbones inner event, - // It has no event object. - this._eventTarget && this._eventTarget.emit(dragonBones.EventObject.COMPLETE); - this._playCount ++; if ((this.playTimes > 0 && this._playCount >= this.playTimes)) { // set frame to end frame. @@ -559,10 +560,12 @@ let ArmatureDisplay = cc.Class({ this._accTime = 0; this._playing = false; this._playCount = 0; + this._emitCacheCompleteEvent(); return; } this._accTime = 0; frameIdx = 0; + this._emitCacheCompleteEvent(); } this._curFrame = frames[frameIdx]; diff --git a/extensions/dragonbones/webgl-assembler.js b/extensions/dragonbones/webgl-assembler.js index 3b89f5d1965..f7a856127ca 100644 --- a/extensions/dragonbones/webgl-assembler.js +++ b/extensions/dragonbones/webgl-assembler.js @@ -75,7 +75,7 @@ function _getSlotMaterial (tex, blendMode) { let useModel = !_comp.enableBatch; // Add useModel flag due to if pre same db useModel but next db no useModel, // then next db will multiply model matrix more than once. - let key = tex.url + src + dst + useModel; + let key = tex.getId() + src + dst + useModel; let baseMaterial = _comp.sharedMaterials[0]; if (!baseMaterial) { return null; diff --git a/extensions/spine/Skeleton.js b/extensions/spine/Skeleton.js index f4e1ae96470..3d18a1c1ad1 100644 --- a/extensions/spine/Skeleton.js +++ b/extensions/spine/Skeleton.js @@ -518,7 +518,7 @@ sp.Skeleton = cc.Class({ */ setSlotsRange (startSlotIndex, endSlotIndex) { if (this.isAnimationCached()) { - console.warn("Slots visible range can not be modified in cached mode."); + cc.warn("Slots visible range can not be modified in cached mode."); } else { this._startSlotIndex = startSlotIndex; this._endSlotIndex = endSlotIndex; @@ -535,7 +535,7 @@ sp.Skeleton = cc.Class({ */ setAnimationStateData (stateData) { if (this.isAnimationCached()) { - console.warn("'setAnimationStateData' interface can not be invoked in cached mode."); + cc.warn("'setAnimationStateData' interface can not be invoked in cached mode."); } else { var state = new spine.AnimationState(stateData); if (this._listener) { @@ -637,6 +637,15 @@ sp.Skeleton = cc.Class({ } }, + _emitCacheCompleteEvent () { + if (!this._listener) return; + // Animation complete, the event diffrent from dragonbones inner event, + // It has no event object. + this._endEntry.animation.name = this._animationName; + this._listener.complete && this._listener.complete(this._endEntry); + this._listener.end && this._listener.end(this._endEntry); + }, + _updateCache (dt) { let frameCache = this._frameCache; let frames = frameCache.frames; @@ -656,13 +665,6 @@ sp.Skeleton = cc.Class({ } if (frameCache.isCompleted && frameIdx >= frames.length) { - - // Animation complete, the event diffrent from dragonbones inner event, - // It has no event object. - this._endEntry.animation.name = this._animationName; - this._listener && this._listener.complete && this._listener.complete(this._endEntry); - this._listener && this._listener.end && this._listener.end(this._endEntry); - this._playCount ++; if (this._playTimes > 0 && this._playCount >= this._playTimes) { // set frame to end frame. @@ -670,10 +672,12 @@ sp.Skeleton = cc.Class({ this._accTime = 0; this._playCount = 0; this._isAniComplete = true; + this._emitCacheCompleteEvent(); return; } this._accTime = 0; frameIdx = 0; + this._emitCacheCompleteEvent(); } this._curFrame = frames[frameIdx]; }, @@ -1062,7 +1066,7 @@ sp.Skeleton = cc.Class({ */ getCurrent (trackIndex) { if (this.isAnimationCached()) { - console.warn("'getCurrent' interface can not be invoked in cached mode."); + cc.warn("'getCurrent' interface can not be invoked in cached mode."); } else { if (this._state) { return this._state.getCurrent(trackIndex); @@ -1078,7 +1082,7 @@ sp.Skeleton = cc.Class({ */ clearTracks () { if (this.isAnimationCached()) { - console.warn("'clearTracks' interface can not be invoked in cached mode."); + cc.warn("'clearTracks' interface can not be invoked in cached mode."); } else { if (this._state) { this._state.clearTracks(); @@ -1094,7 +1098,7 @@ sp.Skeleton = cc.Class({ */ clearTrack (trackIndex) { if (this.isAnimationCached()) { - console.warn("'clearTrack' interface can not be invoked in cached mode."); + cc.warn("'clearTrack' interface can not be invoked in cached mode."); } else { if (this._state) { this._state.clearTrack(trackIndex); diff --git a/extensions/spine/editor/spine-meta.js b/extensions/spine/editor/spine-meta.js index 21455c7ea19..4904f470ef3 100644 --- a/extensions/spine/editor/spine-meta.js +++ b/extensions/spine/editor/spine-meta.js @@ -129,7 +129,7 @@ class SpineMeta extends CustomAssetMeta { //this.textures[0] = value; } - static version () { return '1.2.1'; } + static version () { return '1.2.2'; } static defaultType () { return 'spine'; } @@ -176,7 +176,6 @@ class SpineMeta extends CustomAssetMeta { var asset = new sp.SkeletonData(); asset.name = Path.basenameNoExt(fspath); asset.skeletonJson = json; - asset.skeletonJsonStr = data; asset.scale = this.scale; loadAtlasText(fspath, (err, res) => { diff --git a/extensions/spine/skeleton-data.js b/extensions/spine/skeleton-data.js index cc649287536..31054ec3ecc 100644 --- a/extensions/spine/skeleton-data.js +++ b/extensions/spine/skeleton-data.js @@ -43,11 +43,19 @@ var SkeletonData = cc.Class({ }, properties: { - - // store skeleton json string for jsb - skeletonJsonStr: "", _skeletonJson: null, + // use by jsb + skeletonJsonStr: { + get: function () { + if (this._skeletonJson) { + return JSON.stringify(this._skeletonJson); + } else { + return ""; + } + } + }, + /** * !#en See http://en.esotericsoftware.com/spine-json-format * !#zh 可查看 Spine 官方文档 http://zh.esotericsoftware.com/spine-json-format @@ -58,9 +66,11 @@ var SkeletonData = cc.Class({ return this._skeletonJson; }, set: function (value) { - this._skeletonJson = value; - // If dynamic set skeletonJson field, auto update skeletonJsonStr field. - this.skeletonJsonStr = JSON.stringify(value); + if (typeof(value) == "string") { + this._skeletonJson = JSON.parse(value); + } else { + this._skeletonJson = value; + } // If create by manual, uuid is empty. if (!this._uuid && value.skeleton) { this._uuid = value.skeleton.hash; diff --git a/extensions/spine/spine-assembler.js b/extensions/spine/spine-assembler.js index 0a80eaec80c..0d292b7ead7 100644 --- a/extensions/spine/spine-assembler.js +++ b/extensions/spine/spine-assembler.js @@ -106,7 +106,7 @@ function _getSlotMaterial (tex, blendMode) { } let useModel = !_comp.enableBatch; - let key = tex.url + src + dst + _useTint + useModel; + let key = tex.getId() + src + dst + _useTint + useModel; let baseMaterial = _comp.sharedMaterials[0]; if (!baseMaterial) return null;