mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-12-12 08:41:46 -05:00
87 lines
4 KiB
CoffeeScript
87 lines
4 KiB
CoffeeScript
SpriteBuilder = require 'lib/sprites/SpriteBuilder'
|
|
|
|
floors = ['Dungeon Floor', 'Indoor Floor', 'Grass', 'Grass01', 'Grass02', 'Grass03', 'Grass04', 'Grass05', 'Goal Trigger', 'Obstacle', 'Sand 01', 'Sand 02', 'Sand 03', 'Sand 04', 'Sand 05', 'Sand 06', 'Talus 1', 'Talus 2', 'Talus 3', 'Talus 4', 'Talus 5', 'Talus 6', 'Firn 1', 'Firn 2', 'Firn 3', 'Firn 4', 'Firn 5', 'Firn 6', 'Ice Rink 1', 'Ice Rink 2', 'Ice Rink 3', 'Firn Cliff']
|
|
|
|
cliffs = ['Dungeon Pit', 'Grass Cliffs']
|
|
|
|
module.exports = class SingularSprite extends createjs.Sprite
|
|
childMovieClips: null
|
|
|
|
constructor: (@spriteSheet, @thangType, @spriteSheetPrefix, @resolutionFactor=SPRITE_RESOLUTION_FACTOR) ->
|
|
super(@spriteSheet)
|
|
|
|
destroy: ->
|
|
@removeAllEventListeners()
|
|
|
|
gotoAndPlay: (actionName) -> @goto(actionName, false)
|
|
gotoAndStop: (actionName) -> @goto(actionName, true)
|
|
_gotoAndPlay: createjs.Sprite.prototype.gotoAndPlay
|
|
_gotoAndStop: createjs.Sprite.prototype.gotoAndStop
|
|
|
|
goto: (actionName, @paused=true) ->
|
|
@actionNotSupported = false
|
|
|
|
action = @thangType.getActions()[actionName]
|
|
randomStart = _.string.startsWith(actionName, 'move')
|
|
reg = action.positions?.registration or @thangType.get('positions')?.registration or {x:0, y:0}
|
|
|
|
if action.animation
|
|
@framerate = (action.framerate ? 20) * (action.speed ? 1)
|
|
|
|
func = if @paused then '_gotoAndStop' else '_gotoAndPlay'
|
|
animationName = @spriteSheetPrefix + actionName
|
|
@[func](animationName)
|
|
if @currentFrame is 0 or @usePlaceholders
|
|
@_gotoAndStop(0)
|
|
@notifyActionNeedsRender(action)
|
|
bounds = @thangType.get('raw').animations[action.animation].bounds
|
|
actionScale = (action.scale ? @thangType.get('scale') ? 1)
|
|
@scaleX = actionScale * bounds[2] / (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor)
|
|
@scaleY = actionScale * bounds[3] / (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor)
|
|
@regX = (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor) * ((-reg.x - bounds[0]) / bounds[2])
|
|
@regY = (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor) * ((-reg.y - bounds[1]) / bounds[3])
|
|
else
|
|
scale = @resolutionFactor * (action.scale ? @thangType.get('scale') ? 1)
|
|
@regX = -reg.x * scale
|
|
@regY = -reg.y * scale
|
|
@scaleX = @scaleY = 1 / @resolutionFactor
|
|
@framerate = action.framerate or 20
|
|
if randomStart and frames = @spriteSheet.getAnimation(animationName)?.frames
|
|
@currentAnimationFrame = Math.floor(Math.random() * frames.length)
|
|
|
|
if action.container
|
|
animationName = @spriteSheetPrefix + actionName
|
|
@_gotoAndStop(animationName)
|
|
if @currentFrame is 0 or @usePlaceholders
|
|
@_gotoAndStop(0)
|
|
@notifyActionNeedsRender(action)
|
|
bounds = @thangType.get('raw').containers[action.container].b
|
|
actionScale = (action.scale ? @thangType.get('scale') ? 1)
|
|
@scaleX = actionScale * bounds[2] / (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor)
|
|
@scaleY = actionScale * bounds[3] / (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor)
|
|
@regX = (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor) * ((-reg.x - bounds[0]) / bounds[2])
|
|
@regY = (SPRITE_PLACEHOLDER_WIDTH * @resolutionFactor) * ((-reg.y - bounds[1]) / bounds[3])
|
|
else
|
|
scale = @resolutionFactor * (action.scale ? @thangType.get('scale') ? 1)
|
|
@regX = -reg.x * scale
|
|
@regY = -reg.y * scale
|
|
@scaleX = @scaleY = 1 / @resolutionFactor
|
|
|
|
@scaleX *= -1 if action.flipX
|
|
@scaleY *= -1 if action.flipY
|
|
@baseScaleX = @scaleX
|
|
@baseScaleY = @scaleY
|
|
if @camera and @thangType.get('name') in floors
|
|
@baseScaleY *= @camera.y2x
|
|
else if @camera and @thangType.get('name') in cliffs
|
|
if actionName is 'idle_side'
|
|
@baseScaleX *= @camera.x2y# / 0.85
|
|
@baseScaleY *= @camera.y2x * 0.85
|
|
else
|
|
@baseScaleY *= @camera.y2x / 0.85
|
|
console.log 'it is a cliff!', actionName, @baseScaleX, @baseScaleY
|
|
@currentAnimation = actionName
|
|
return
|
|
|
|
notifyActionNeedsRender: (action) ->
|
|
@lank?.trigger('action-needs-render', @lank, action)
|