(use arrow keys to move character)
NOTE: This uses Spritify 1.0.3 and does not work on my website as I have switched to the 2.x version. I will be rewriting this for the 2.x version shortly.
$(document).ready(function() { $('#character').spritify({ image : '/sites/all/themes/epiphany/scripts/spritify/character.png', collisionDetection : chkScrollMove }); function chkScrollMove(settings,obj,dir) { //set the map object var map = $('#map'); switch(dir) { case'front': // if the obj is less than or equal to 2x distanceOnPress from the bottom of the stage // AND the obj is not greater than or equal to 2x distanceOnPress from the top of the stage // AND the "map" graphic is not at the bottom // AND the obj will not collide if (obj.position().top <= (obj.parent().height() - (settings.distanceOnPress * 2)) && obj.position().top >= (settings.distanceOnPress * 2) && (Math.abs(map.position().top) + obj.parent().height()) < (map.height() - settings.distanceOnPress) && chkCollisions(settings,obj,dir)) { //move all background objects and NOT the main object obj.siblings().each(function() { $(this).animate({top: '-='+settings.distanceOnPress}, settings.charSpeed, "linear"); }); } else if (obj.position().top + settings.distanceOnPress < obj.parent().height() && chkCollisions(settings,obj,dir)) { //move main object return true; } break; case'back': // if the obj is greater than or equal to 2x distanceOnPress from the bottom of the stage // AND the obj is less than 2x distanceOnPress from the top of the stage // AND the "map" graphic is not at its top // AND the obj will not collide if (obj.position().top >= (settings.distanceOnPress * 2) && obj.position().top < (obj.parent().height() - (settings.distanceOnPress * 2)) && map.position().top < (0 - settings.distanceOnPress) && chkCollisions(settings,obj,dir)) { //move all background objects and NOT the main object obj.siblings().each(function() { $(this).animate({top: '+='+settings.distanceOnPress}, settings.charSpeed, "linear"); }); } else if (obj.position().top - settings.distanceOnPress >= 0 && chkCollisions(settings,obj,dir)) { //move main object return true; } break; case'left': // if the obj is less than 2x distanceOnPress from the left of the stage // AND the obj is greater than or equal to 2x distanceOnPress from the right of the stage // AND the "map" graphic is not at the right // AND the obj will not collide if (obj.position().left < (obj.parent().width() - (settings.distanceOnPress * 2)) && obj.position().left >= (settings.distanceOnPress * 2) && map.position().left < (0 - settings.distanceOnPress) && chkCollisions(settings,obj,dir)) { //move all background objects and NOT the main object obj.siblings().each(function() { $(this).animate({left: '+='+settings.distanceOnPress}, settings.charSpeed, "linear"); }); } else if (obj.position().left - settings.distanceOnPress >= 0 && chkCollisions(settings,obj,dir)) { //move main object return true; } break; case'right': // if the obj is less than or equal to 2x distanceOnPress from the left of the stage // AND the obj is greater than or equal to 2x distanceOnPress from the right of the stage // AND the "map" graphic is not at the left // AND the obj will not collide if (obj.position().left <= (obj.parent().width() - (settings.distanceOnPress * 2)) && obj.position().left >= (settings.distanceOnPress * 2) && (Math.abs(map.position().left) + obj.parent().width()) < (map.width() - settings.distanceOnPress) && chkCollisions(settings,obj,dir)) { //move all background objects and NOT the main object obj.siblings().each(function() { $(this).animate({left: '-='+settings.distanceOnPress}, settings.charSpeed, "linear"); }); } else if (obj.position().left + settings.distanceOnPress < obj.parent().width() && chkCollisions(settings,obj,dir)) { //move main object return true; } break; } //end switch //no validation occured, do not allow movement return false; } //END chkScrollMove function chkCollisions(settings,obj,dir) { var collisionClass = $('.impassable'); var objPos = getPositions(obj); //add the movement distance to the current position switch(dir) { case'front': objPos[1][0] += settings.distanceOnPress; objPos[1][1] += settings.distanceOnPress; break; case'back': objPos[1][0] -= settings.distanceOnPress; objPos[1][1] -= settings.distanceOnPress; break; case'left': objPos[0][0] -= settings.distanceOnPress; objPos[0][1] -= settings.distanceOnPress; break; case'right': objPos[0][0] += settings.distanceOnPress; objPos[0][1] += settings.distanceOnPress; break; } //end switch var collided = false; collisionClass.each(function() { var divPos = getPositions($(this)); var chkWidth = comparePositions(objPos[0], divPos[0]); var chkHeight = comparePositions(objPos[1], divPos[1]); if (chkWidth && chkHeight) collided = true; }); if (collided) { return false; } else { return true; } } //END chkCollisions function getPositions(obj) { var pos, width, height; pos = $(obj).position(); width = $(obj).width(); height = $(obj).height(); return [ [ pos.left, pos.left + width ], [ pos.top, pos.top + height ] ]; } function comparePositions(p1,p2) { var r1, r2; //set r1 = to the furthest left element //set r2 = the other element r1 = p1[0] < p2[0] ? p1 : p2; r2 = p1[0] < p2[0] ? p2 : p1; //return 'true' if the value of the width of the far left element is intersected by the next element //OR return 'true; if the two objects are in line return r1[1] > r2[0] || r1[0] === r2[0]; } });
<style type="text/css">
#character {
  position: absolute;
  top: 32px;
}
 
#stage {
	  position: relative;
          float: right;
	  width: 320px;
	  height: 320px;
	  margin-left: 10px;
	  border: solid 2px #000;
	  overflow: hidden;
  }
 
  #map {
	  position: absolute;
	  width: 800px;
	  height: 800px;
	  background: url('/sites/all/themes/epiphany/scripts/spritify/map.jpg') no-repeat;
  }
 
  #object1 {
	position: absolute;
	width: 800px;
	height: 32px;
	top: 0px;
	left: 0px;
  }
  #object2 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 32px;
	left: 96px;
  }
 #object3 {
	position: absolute;
	width: 64px;
	height: 32px;
	top: 32px;
	left: 224px;
  }
#object4 {
	position: absolute;
	width: 64px;
	height: 32px;
	top: 32px;
	left: 416px;
  }
#object5 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 32px;
	left: 608px;
  }
#object6 {
	position: absolute;
	width: 96px;
	height: 384px;
	top: 96px;
	left: 0px;
  }
#object7 {
	position: absolute;
	width: 416px;
	height: 32px;
	top: 96px;
	left: 192px;
  }
#object8 {
	position: absolute;
	width: 96px;
	height: 384px;
	top: 96px;
	left: 704px;
  }
#object9 {
	position: absolute;
	width: 32px;
	height: 352px;
	top: 128px;
	left: 192px;
  }
#object10 {
	position: absolute;
	width: 32px;
	height: 352px;
	top: 128px;
	left: 576px;
  }
#object11 {
	position: absolute;
	width: 192px;
	height: 32px;
	top: 448px;
	left: 192px;
  }
#object12 {
	position: absolute;
	width: 160px;
	height: 32px;
	top: 448px;
	left: 416px;
  }
#leftTreeinGrave{
	position: absolute;
	width: 32px;
	height: 32px;
	top: 128px;
	left: 224px;
  }
#rightTreeinGrave{
	position: absolute;
	width: 32px;
	height: 32px;
	top: 128px;
	left: 544px;
  }
#graveFlowers{
	position: absolute;
	width: 160px;
	height: 32px;
	top: 224px;
	left: 320px;
  }
#grave{
	position: absolute;
	width: 32px;
	height: 32px;
	top: 256px;
	left: 384px;
  }
#leftTreeRow {
	position: absolute;
	width: 32px;
	height: 160px;
	top: 480px;
	left: 0px;
  }
#leftRock {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 608px;
	left: 32px;
  }
#blTreeRow {
	position: absolute;
	width: 160px;
	height: 32px;
	top: 640px;
	left: 0px;
  }
#object13Tree {
	position: absolute;
	width: 32px;
	height: 64px;
	top: 640px;
	left: 160px;
  }
#blTreeVertRow {
	position: absolute;
	width: 32px;
	height: 128px;
	top: 672px;
	left: 128px;
  }
#verybottomtreerow {
	position: absolute;
	width: 640px;
	height: 32px;
	top: 768px;
	left: 160px;
  }
#nextbottomtreerow {
	position: absolute;
	width: 416px;
	height: 32px;
	top: 736px;
	left: 192px;
  }
#nextbottomtree1 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 736px;
	left: 640px;
  }
#nextbottomtree2 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 736px;
	left: 704px;
  }
#bottomtreerow3 {
	position: absolute;
	width: 64px;
	height: 32px;
	top: 704px;
	left: 384px;
  }
#bottomtreerow3two {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 704px;
	left: 576px;
  }
#bottomtreerow4 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 672px;
	left: 416px;
  }
#rightTreeRow {
	position: absolute;
	width: 32px;
	height: 160px;
	top: 480px;
	left: 768px;
  }
#bush1 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 544px;
	left: 160px;
  }
#tree1 {
	position: absolute;
	width: 32px;
	height: 64px;
	top: 512px;
	left: 256px;
  }
#bush2 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 608px;
	left: 512px;
  }
#rock2 {
	position: absolute;
	width: 32px;
	height: 32px;
	top: 608px;
	left: 672px;
  }
</style><div id="stage"> <div id="character"></div> <div id="map"></div> <div id="object1" class="impassable"></div> <div id="object2" class="impassable"></div> <div id="object3" class="impassable"></div> <div id="object4" class="impassable"></div> <div id="object5" class="impassable"></div> <div id="object6" class="impassable"></div> <div id="object7" class="impassable"></div> <div id="object8" class="impassable"></div> <div id="object9" class="impassable"></div> <div id="object10" class="impassable"></div> <div id="object11" class="impassable"></div> <div id="object12" class="impassable"></div> <div id="leftTreeinGrave" class="impassable"></div> <div id="rightTreeinGrave" class="impassable"></div> <div id="graveFlowers" class="impassable"></div> <div id="grave" class="impassable"></div> <div id="leftTreeRow" class="impassable"></div> <div id="leftRock" class="impassable"></div> <div id="blTreeRow" class="impassable"></div> <div id="object13Tree" class="impassable"></div> <div id="blTreeVertRow" class="impassable"></div> <div id="verybottomtreerow" class="impassable"></div> <div id="nextbottomtreerow" class="impassable"></div> <div id="nextbottomtree1" class="impassable"></div> <div id="nextbottomtree2" class="impassable"></div> <div id="bottomtreerow3" class="impassable"></div> <div id="bottomtreerow3two" class="impassable"></div> <div id="bottomtreerow4" class="impassable"></div> <div id="rightTreeRow" class="impassable"></div> <div id="bush1" class="impassable"></div> <div id="tree1" class="impassable"></div> <div id="bush2" class="impassable"></div> <div id="rock2" class="impassable"></div> </div>
