Refactored out displayObject from CocoSprites.

This commit is contained in:
Scott Erickson 2014-05-14 15:59:56 -07:00
parent 4e268d8dc6
commit 2a17ec5cb9
11 changed files with 82 additions and 69 deletions

View file

@ -16,7 +16,6 @@ healthColors =
module.exports = CocoSprite = class CocoSprite extends CocoClass
thangType: null # ThangType instance
displayObject: null
imageObject: null
healthBar: null
@ -62,6 +61,10 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@options = _.extend($.extend(true, {}, @options), options)
@setThang @options.thang
console.error @toString(), "has no ThangType!" unless @thangType
# this is a stub, use @setImageObject to swap it out for something else later
@imageObject = new createjs.Container
@actionQueue = []
@marks = {}
@labels = {}
@ -69,7 +72,6 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@handledAoEs = {}
@age = 0
@scaleFactor = @targetScaleFactor = 1
@displayObject = new createjs.Container()
if @thangType.isFullyLoaded()
@setupSprite()
else
@ -90,15 +92,15 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
setUpRasterImage: ->
raster = @thangType.get('raster')
sprite = @imageObject = new createjs.Bitmap('/file/'+raster)
$(sprite.image).one 'load', => @updateScale?()
@displayObject.addChild(sprite)
image = new createjs.Bitmap('/file/'+raster)
@setImageObject image
$(image.image).one 'load', => @updateScale?()
@configureMouse()
@originalScaleX = sprite.scaleX
@originalScaleY = sprite.scaleY
@displayObject.sprite = @
@displayObject.layerPriority = @thangType.get 'layerPriority'
@displayObject.name = @thang?.spriteName or @thangType.get 'name'
@originalScaleX = image.scaleX
@originalScaleY = image.scaleY
@imageObject.sprite = @
@imageObject.layerPriority = @thangType.get 'layerPriority'
@imageObject.name = @thang?.spriteName or @thangType.get 'name'
reg = @getOffset 'registration'
@imageObject.regX = -reg.x
@imageObject.regY = -reg.y
@ -108,7 +110,6 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
mark.destroy() for name, mark of @marks
label.destroy() for name, label of @labels
@imageObject?.off 'animationend', @playNextAction
@displayObject?.off()
clearInterval @effectInterval if @effectInterval
super()
@ -119,6 +120,12 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
options.colorConfig = @options.colorConfig if @options.colorConfig
options.async = false
@thangType.getSpriteSheet options
setImageObject: (newImageObject) ->
if parent = @imageObject?.parent
parent.removeChild @imageObject
parent.addChild newImageObject
@imageObject = newImageObject
buildFromSpriteSheet: (spriteSheet) ->
if spriteSheet
@ -129,17 +136,16 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
# temp, until these are re-exported with perspective
if @options.camera and @thangType.get('name') in ['Dungeon Floor', 'Indoor Floor', 'Grass', 'Goal Trigger', 'Obstacle']
sprite.scaleY *= @options.camera.y2x
@displayObject.removeChild(@imageObject) if @imageObject
@imageObject = sprite
@displayObject.addChild(sprite)
@setImageObject sprite
@addHealthBar()
@configureMouse()
# TODO: generalize this later?
@originalScaleX = sprite.scaleX
@originalScaleY = sprite.scaleY
@displayObject.sprite = @
@displayObject.layerPriority = @thangType.get 'layerPriority'
@displayObject.name = @thang?.spriteName or @thangType.get 'name'
@imageObject.sprite = @
@imageObject.layerPriority = @thangType.get 'layerPriority'
@imageObject.name = @thang?.spriteName or @thangType.get 'name'
@imageObject.on 'animationend', @playNextAction
##################################################
@ -211,6 +217,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@updateStats()
@updateGold()
@showAreaOfEffects()
@updateHealthBar()
@updateMarks()
@updateLabels()
@ -242,7 +249,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
cache: ->
bounds = @imageObject.getBounds()
@displayObject.cache 0, 0, bounds.width, bounds.height
@imageObject.cache 0, 0, bounds.width, bounds.height
#console.log "just cached", @thang.id, "which was at", @imageObject.x, @imageObject.y, bounds.width, bounds.height, "with scale", Math.max(@imageObject.scaleX, @imageObject.scaleY)
getBobOffset: ->
@ -263,7 +270,7 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
[p0, p1] = [@lastPos, @thang.pos]
return if p0 and p0.x is p1.x and p0.y is p1.y and p0.z is p1.z and not @options.camera.tweeningZoomTo and not @thang.bobHeight
sup = @options.camera.worldToSurface wop
[@displayObject.x, @displayObject.y] = [sup.x, sup.y]
[@imageObject.x, @imageObject.y] = [sup.x, sup.y]
@lastPos = p1.copy?() or _.clone(p1)
@hasMoved = true
@ -441,14 +448,14 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
[bar.x, bar.y] = [healthOffset.x - bar.width / 2, healthOffset.y]
configureMouse: ->
@displayObject.cursor = 'pointer' if @thang?.isSelectable
@displayObject.mouseEnabled = @displayObject.mouseChildren = false unless @thang?.isSelectable or @thang?.isLand
if @displayObject.mouseEnabled
@displayObject.on 'mousedown', @onMouseEvent, @, false, 'sprite:mouse-down'
@displayObject.on 'click', @onMouseEvent, @, false, 'sprite:clicked'
@displayObject.on 'dblclick', @onMouseEvent, @, false, 'sprite:double-clicked'
@displayObject.on 'pressmove', @onMouseEvent, @, false, 'sprite:dragged'
@displayObject.on 'pressup', @onMouseEvent, @, false, 'sprite:mouse-up'
@imageObject.cursor = 'pointer' if @thang?.isSelectable
@imageObject.mouseEnabled = @imageObject.mouseChildren = false unless @thang?.isSelectable or @thang?.isLand
if @imageObject.mouseEnabled
@imageObject.on 'mousedown', @onMouseEvent, @, false, 'sprite:mouse-down'
@imageObject.on 'click', @onMouseEvent, @, false, 'sprite:clicked'
@imageObject.on 'dblclick', @onMouseEvent, @, false, 'sprite:double-clicked'
@imageObject.on 'pressmove', @onMouseEvent, @, false, 'sprite:dragged'
@imageObject.on 'pressup', @onMouseEvent, @, false, 'sprite:mouse-up'
onSetLetterbox: (e) ->
@letterboxOn = e.on
@ -458,15 +465,14 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
Backbone.Mediator.publish ourEventName, sprite: @, thang: @thang, originalEvent: e
addHealthBar: ->
@displayObject.removeChild @healthBar if @healthBar?.parent
return unless @thang?.health? and "health" in (@thang?.hudProperties ? [])
healthColor = healthColors[@thang?.team] ? healthColors["neutral"]
healthOffset = @getOffset 'aboveHead'
bar = @healthBar = createProgressBar(healthColor, healthOffset.y)
bar.x = healthOffset.x - bar.width / 2
bar = @healthBar = createProgressBar(healthColor, healthOffset)
bar.name = 'health bar'
bar.cache 0, -bar.height * bar.baseScale / 2, bar.width * bar.baseScale, bar.height * bar.baseScale
@displayObject.addChild bar
@options.floatingLayer.addChild bar
@updateHealthBar()
getActionProp: (prop, subProp, def=null) ->
# Get a property or sub-property from an action, falling back to ThangType
@ -733,3 +739,8 @@ module.exports = CocoSprite = class CocoSprite extends CocoClass
@shadow.rotation = @thang.rotation
@shadow.action = @thang.action
@shadow.actionActivated = @thang.actionActivated
updateHealthBar: ->
return unless @healthBar
@healthBar.x = @imageObject.x
@healthBar.y = @imageObject.y

View file

@ -67,7 +67,7 @@ module.exports = class Dimmer extends CocoClass
@dimMask.graphics.clear()
for thangID, sprite of @sprites
continue unless (thangID in @highlightedThangIDs) or sprite.isTalking?() or sprite.thang?.id is 'My Wizard'
sup = x: sprite.displayObject.x, y: sprite.displayObject.y
sup = x: sprite.imageObject.x, y: sprite.imageObject.y
cap = @camera.surfaceToCanvas sup
r = 50 * @camera.zoom # TODO: find better way to get the radius based on the sprite's size
@dimMask.graphics.beginRadialGradientFill(["rgba(0,0,0,1)", "rgba(0,0,0,0)"], [0.5, 1], cap.x, cap.y, 0, cap.x, cap.y, r).drawCircle(cap.x, cap.y, r)

View file

@ -49,8 +49,8 @@ module.exports = class Label extends CocoClass
offset ?= x: 0, y: 0 # temp (if not CocoSprite)
rotation = @sprite.getRotation()
offset.x *= -1 if rotation >= 135 or rotation <= -135
@label.x = @background.x = @sprite.displayObject.x + offset.x
@label.y = @background.y = @sprite.displayObject.y + offset.y
@label.x = @background.x = @sprite.imageObject.x + offset.x
@label.y = @background.y = @sprite.imageObject.y + offset.y
null
buildLabelOptions: ->
@ -108,7 +108,7 @@ module.exports = class Label extends CocoClass
pointerWidth += radius # Convenience value including pointer width and border radius
# Figure out the position of the pointer for the bubble
sup = x: @sprite.displayObject.x, y: @sprite.displayObject.y # a little more accurate to aim for mouth--how?
sup = x: @sprite.imageObject.x, y: @sprite.imageObject.y # a little more accurate to aim for mouth--how?
cap = @camera.surfaceToCanvas sup
hPos = if cap.x / @camera.canvasWidth > 0.53 then 'right' else 'left'
vPos = if cap.y / @camera.canvasHeight > 0.53 then 'bottom' else 'top'

View file

@ -182,7 +182,7 @@ module.exports = class Mark extends CocoClass
CocoSprite = require './CocoSprite'
markSprite = new CocoSprite @thangType, @thangType.spriteOptions
markSprite.queueAction 'idle'
@mark = markSprite.displayObject
@mark = markSprite.imageObject
@markSprite = markSprite
loadThangType: ->
@ -205,7 +205,6 @@ module.exports = class Mark extends CocoClass
@updatePosition pos
@updateRotation()
@updateScale()
@mark.advance?()
if @name is 'highlight' and @highlightDelay and not @highlightTween
@mark.visible = false
@highlightTween = createjs.Tween.get(@mark).to({}, @highlightDelay).call =>
@ -220,7 +219,7 @@ module.exports = class Mark extends CocoClass
worldZ = @sprite.thang.pos.z - @sprite.thang.depth / 2 + @sprite.getBobOffset()
@mark.alpha = 0.451 / Math.sqrt(worldZ / 2 + 1)
else
pos ?= @sprite?.displayObject
pos ?= @sprite?.imageObject
@mark.x = pos.x
@mark.y = pos.y
if @statusEffect or @name is 'highlight'
@ -251,6 +250,9 @@ module.exports = class Mark extends CocoClass
if @sprite?.thang.spriteName.search(/(dungeon|indoor).wall/i) isnt -1
scale *= 2
@mark.scaleX = @mark.scaleY = Math.min 1, scale
if @markSprite?
@mark.scaleX *= @markSprite.originalScaleX
@mark.scaleY *= @markSprite.originalScaleY
if @name in ['selection', 'target', 'repair']
@mark.scaleY *= @camera.y2x # code applies perspective

View file

@ -11,7 +11,7 @@ module.exports = class SpriteBoss extends CocoClass
subscriptions:
'bus:player-joined': 'onPlayerJoined'
'bus:player-left': 'onPlayerLeft'
'level-set-debug': 'onSetDebug'
# 'level-set-debug': 'onSetDebug'
'level-highlight-sprites': 'onHighlightSprites'
'sprite:mouse-up': 'onSpriteMouseUp'
'surface:stage-mouse-down': 'onStageMouseDown'
@ -79,8 +79,8 @@ module.exports = class SpriteBoss extends CocoClass
@sprites[id] = sprite
@spriteArray.push sprite
layer ?= @spriteLayers["Obstacle"] if sprite.thang?.spriteName.search(/(dungeon|indoor).wall/i) isnt -1
layer ?= @layerForChild sprite.displayObject, sprite
layer.addChild sprite.displayObject
layer ?= @layerForChild sprite.imageObject, sprite
layer.addChild sprite.imageObject
layer.updateLayerOrder()
sprite
@ -157,7 +157,7 @@ module.exports = class SpriteBoss extends CocoClass
sprite
removeSprite: (sprite) ->
sprite.displayObject.parent.removeChild sprite.displayObject
sprite.imageObject.parent.removeChild sprite.imageObject
thang = sprite.thang
delete @sprites[sprite.thang.id]
@spriteArray.splice @spriteArray.indexOf(sprite), 1
@ -183,11 +183,11 @@ module.exports = class SpriteBoss extends CocoClass
else
sprite = @addThangToSprites(thang)
Backbone.Mediator.publish 'surface:new-thang-added', thang:thang, sprite:sprite
updateCache = updateCache or sprite.displayObject.parent is @spriteLayers["Obstacle"]
updateCache = updateCache or sprite.imageObject.parent is @spriteLayers["Obstacle"]
sprite.playSounds()
for thangID, sprite of @sprites
missing = not (sprite.notOfThisWorld or @world.thangMap[thangID]?.exists)
isObstacle = sprite.displayObject.parent is @spriteLayers["Obstacle"]
isObstacle = sprite.imageObject.parent is @spriteLayers["Obstacle"]
updateCache = updateCache or (isObstacle and (missing or sprite.hasMoved))
sprite.hasMoved = false
@removeSprite sprite if missing
@ -266,7 +266,7 @@ module.exports = class SpriteBoss extends CocoClass
worldPos = sprite?.thang?.pos
worldPos ?= @camera.screenToWorld {x: e.originalEvent.rawX, y: e.originalEvent.rawY} if e
if worldPos and (@options.navigateToSelection or not sprite or treemaThangSelected)
@camera.zoomTo(sprite?.displayObject or @camera.worldToSurface(worldPos), @camera.zoom, 1000, true)
@camera.zoomTo(sprite?.imageObject or @camera.worldToSurface(worldPos), @camera.zoom, 1000, true)
sprite = null if @options.choosing # Don't select sprites while choosing
if sprite isnt @selectedSprite
@selectedSprite?.selected = false

View file

@ -249,7 +249,7 @@ module.exports = Surface = class Surface extends CocoClass
onSetCamera: (e) ->
if e.thangID
return unless target = @spriteBoss.spriteFor(e.thangID)?.displayObject
return unless target = @spriteBoss.spriteFor(e.thangID)?.imageObject
else if e.pos
target = @camera.worldToSurface e.pos
else

View file

@ -64,7 +64,7 @@ module.exports = class WizardSprite extends IndieSprite
onMeSynced: (e) ->
return unless @isSelf
@setNameLabel me.displayName() if @displayObject.visible # not if we hid the wiz
@setNameLabel me.displayName() if @imageObject.visible # not if we hid the wiz
newColorConfig = me.get('wizard')?.colorConfig or {}
shouldUpdate = not _.isEqual(newColorConfig, @options.colorConfig)
@options.colorConfig = $.extend(true, {}, newColorConfig)
@ -77,12 +77,12 @@ module.exports = class WizardSprite extends IndieSprite
@setTarget e.sprite or e.worldPos
animateIn: ->
@displayObject.scaleX = @displayObject.scaleY = @displayObject.alpha = 0
createjs.Tween.get(@displayObject)
@imageObject.scaleX = @imageObject.scaleY = @imageObject.alpha = 0
createjs.Tween.get(@imageObject)
.to({scaleX: 1, scaleY: 1, alpha: 1}, 1000, createjs.Ease.getPowInOut(2.2))
animateOut: (callback) ->
tween = createjs.Tween.get(@displayObject)
tween = createjs.Tween.get(@imageObject)
.to({scaleX: 0, scaleY: 0, alpha: 0}, 1000, createjs.Ease.getPowInOut(2.2))
tween.call(callback) if callback
@ -202,8 +202,8 @@ module.exports = class WizardSprite extends IndieSprite
@thang.pos = @getCurrentPosition()
@faceTarget()
sup = @options.camera.worldToSurface x: @thang.pos.x, y: @thang.pos.y, z: @thang.pos.z - @thang.depth / 2
@displayObject.x = sup.x
@displayObject.y = sup.y
@imageObject.x = sup.x
@imageObject.y = sup.y
getCurrentPosition: ->
"""
@ -244,7 +244,7 @@ module.exports = class WizardSprite extends IndieSprite
@pointToward(@targetSprite.thang.pos)
updateMarks: ->
super() if @displayObject.visible # not if we hid the wiz
super() if @imageObject.visible # not if we hid the wiz
onMoveKey: (e) ->
return unless @isSelf

View file

@ -144,7 +144,7 @@ module.exports.Trailmaster = class Trailmaster
sprites = []
sprite = @sprites[thang.id]
return sprites unless sprite?
lastPos = @camera.surfaceToWorld x: sprite.displayObject.x, y: sprite.displayObject.y
lastPos = @camera.surfaceToWorld x: sprite.imageObject.x, y: sprite.imageObject.y
minDistance = Math.pow(CLONE_INTERVAL * Camera.MPP, 2)
actions = @world.actionsForThang(thang.id)
lastAction = null

View file

@ -3,7 +3,7 @@ PROG_BAR_HEIGHT = 2
PROG_BAR_SCALE = 2.5
EDGE_SIZE = 0.3
module.exports.createProgressBar = createProgressBar = (color, y, width=PROG_BAR_WIDTH, height=PROG_BAR_HEIGHT) ->
module.exports.createProgressBar = createProgressBar = (color, offset, width=PROG_BAR_WIDTH, height=PROG_BAR_HEIGHT) ->
g = new createjs.Graphics()
g.setStrokeStyle(1)
@ -17,12 +17,12 @@ module.exports.createProgressBar = createProgressBar = (color, y, width=PROG_BAR
g.drawRoundRect(sEdge, sEdge - sHeight/2, sWidth-sEdge*2, sHeight-sEdge*2, sHeight-sEdge*2)
s = new createjs.Shape(g)
s.x = -width / 2
s.y = y
s.z = 100
s.baseScale = PROG_BAR_SCALE
s.scaleX = 1 / PROG_BAR_SCALE
s.scaleY = 1 / PROG_BAR_SCALE
s.width = width
s.height = height
s.regX = (-offset.x + width / 2) * PROG_BAR_SCALE
s.regY = (-offset.y) * PROG_BAR_SCALE
return s

View file

@ -277,7 +277,7 @@ module.exports = class ThangsTabView extends View
thang = @createAddThang()
@addThangSprite = @surface.spriteBoss.addThangToSprites thang, @surface.spriteBoss.spriteLayers["Floating"]
@addThangSprite.notOfThisWorld = true
@addThangSprite.displayObject.alpha = 0.75
@addThangSprite.imageObject.alpha = 0.75
@addThangSprite.playSound? 'selected'
pos ?= x: Math.round(@world.width / 2), y: Math.round(@world.height / 2)
@adjustThangPos @addThangSprite, thang, pos
@ -324,11 +324,11 @@ module.exports = class ThangsTabView extends View
onSurfaceMouseOver: (e) ->
return unless @addThangSprite
@addThangSprite.displayObject.visible = true
@addThangSprite.imageObject.visible = true
onSurfaceMouseOut: (e) ->
return unless @addThangSprite
@addThangSprite.displayObject.visible = false
@addThangSprite.imageObject.visible = false
calculateMovement: (pctX, pctY, widthHeightRatio) ->
MOVE_TOP_MARGIN = 1.0 - MOVE_MARGIN

View file

@ -212,7 +212,7 @@ module.exports = class ThangTypeEditView extends View
sprite = new CocoSprite(@thangType, @getSpriteOptions())
@currentSprite?.destroy()
@currentSprite = sprite
@showDisplayObject(sprite.displayObject)
@showImageObject(sprite.imageObject)
@updateScale()
showAnimation: (animationName) ->
@ -234,7 +234,7 @@ module.exports = class ThangTypeEditView extends View
if reg
movieClip.regX = -reg.x
movieClip.regY = -reg.y
@showDisplayObject(movieClip)
@showImageObject(movieClip)
getSpriteOptions: -> { resolutionFactor: @resolution, thang: @mockThang}
@ -244,7 +244,7 @@ module.exports = class ThangTypeEditView extends View
sprite.queueAction(actionName)
@currentSprite?.destroy()
@currentSprite = sprite
@showDisplayObject(sprite.displayObject)
@showImageObject(sprite.imageObject)
updatePortrait: ->
options = @getSpriteOptions()
@ -254,12 +254,12 @@ module.exports = class ThangTypeEditView extends View
portrait.addClass 'img-thumbnail'
$('#portrait').replaceWith(portrait)
showDisplayObject: (displayObject) ->
showImageObject: (imageObject) ->
@clearDisplayObject()
displayObject.x = CENTER.x
displayObject.y = CENTER.y
@stage.addChildAt(displayObject, 1)
@currentObject = displayObject
imageObject.x = CENTER.x
imageObject.y = CENTER.y
@stage.addChildAt(imageObject, 1)
@currentObject = imageObject
@updateDots()
clearDisplayObject: ->
@ -381,7 +381,7 @@ module.exports = class ThangTypeEditView extends View
bounds = obj.frameBounds[0]
obj.regX = bounds.x + bounds.width / 2
obj.regY = bounds.y + bounds.height / 2
@showDisplayObject(obj) if obj
@showImageObject(obj) if obj
obj.y = 200 if obj # truly center the container
@showingSelectedNode = true
@currentSprite?.destroy()