         xShift += coords[0]
         yShift += coords[1]
         @shakes.splice(index, 1) if shake.easing.complete
+
+      cameraPan =
+        x: 0
+        y: 0
+      for motion, index in @motions by -1
+        coordsBefore = motion.coords(motion.easing.value())
+        motion.easing.tick(fd.dt)
+        coordsAfter = motion.coords(motion.easing.value())
+        deltaX = coordsAfter[0] - coordsBefore[0]
+        deltaY = coordsAfter[1] - coordsBefore[1]
+        cameraPan.x += deltaX
+        cameraPan.y += deltaY
+        @x += deltaX
+        @y += deltaY
+        @motions.splice(index, 1) if motion.easing.complete
       x = @x + xShift
       y = @y + yShift
 

  init: ->
    @requires('2D, Edge, Collision')
    @shakes = []
    @attr
      x: 0
      y: 0

    )

  cameraPan: (options) ->
    @motions.push(
      easing: new Crafty.easing(options.duration, 'easeInOutQuad')
      x: options.x ? 0
      y: options.y ? 0
      coords: (v) ->
        [@x * v, @y * v]
    )

  scrollWall: (speed) ->
    if speed.x? && speed.y?
