diff --git a/app/lib/surface/SegmentedSprite.coffee b/app/lib/surface/SegmentedSprite.coffee index c8781257e..1d4f69342 100644 --- a/app/lib/surface/SegmentedSprite.coffee +++ b/app/lib/surface/SegmentedSprite.coffee @@ -4,11 +4,13 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer childMovieClips: null constructor: (@spriteSheet, @thangType, @spriteSheetPrefix, @resolutionFactor=SPRITE_RESOLUTION_FACTOR) -> + @spriteSheet.mcPool ?= {} @initialize(@spriteSheet) @addEventListener 'tick', @handleTick destroy: -> @handleTick = undefined + @baseMovieClip.inUse = false if @baseMovieClip @removeAllEventListeners() # CreateJS.Sprite-like interface @@ -21,7 +23,10 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer goto: (actionName, @paused=true) -> @removeAllChildren() @currentAnimation = actionName - @baseMovieClip = @framerate = @animLength = null + @baseMovieClip.inUse = false if @baseMovieClip + if @childMovieClips + mc.inUse = false for mc in @childMovieClips + @childMovieClips = @baseMovieClip = @framerate = @animLength = null @actionNotSupported = false action = @thangType.getActions()[actionName] @@ -37,6 +42,7 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer @framerate = (action.framerate ? 20) * (action.speed ? 1) @childMovieClips = [] @baseMovieClip = @buildMovieClip(action.animation) + @baseMovieClip.inUse = true @frames = action.frames @frames = (parseInt(f) for f in @frames.split(',')) if @frames @animLength = if @frames then @frames.length else @baseMovieClip.timeline.duration @@ -87,6 +93,13 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer @sprite?.trigger('action-needs-render', @sprite, action) buildMovieClip: (animationName, mode, startPosition, loops) -> + key = JSON.stringify([@spriteSheetPrefix].concat(arguments)) + @spriteSheet.mcPool[key] ?= [] + for mc in @spriteSheet.mcPool[key] + if not mc.inUse + mc.gotoAndStop(mc.currentFrame+0.01) # just to make sure it has its children back + return mc + raw = @thangType.get('raw') animData = raw.animations[animationName] @lastAnimData = animData @@ -119,6 +132,8 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer anim.nominalBounds = new createjs.Rectangle(animData.bounds...) if animData.frameBounds anim.frameBounds = (new createjs.Rectangle(bounds...) for bounds in animData.frameBounds) + + @spriteSheet.mcPool[key].push(anim) return anim buildMovieClipContainers: (localContainers) -> @@ -155,6 +170,7 @@ module.exports = class SegmentedSprite extends createjs.SpriteContainer map = {} for localAnimation in localAnimations animation = @buildMovieClip(localAnimation.gn, localAnimation.a...) + animation.inUse = true animation.setTransform(localAnimation.t...) map[localAnimation.bn] = animation @childMovieClips.push(animation)