topical media & game development

talk show tell print

mobile-graphic-easel-examples-BitmapAnimation.htm / htm



  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      <title>EaselJS Example: Animation sequences & sprite sheets</title>
  
      <link href="mobile-graphic-easel-examples-assets-demoStyles.css" rel="stylesheet" type="text/css" />
  
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-utils-UID.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-geom-Matrix2D.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-events-EventDispatcher.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-DisplayObject.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-Container.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-Stage.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-events-MouseEvent.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-Shape.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-utils-Ticker.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-geom-Rectangle.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-BitmapAnimation.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-display-SpriteSheet.js"></script>
      <script type="text/javascript" src="mobile-graphic-easel-src-easeljs-utils-SpriteSheetUtils.js"></script>
  
      <!-- We also provide hosted minified versions of all CreateJS libraries.
         http://code.createjs.com -->
  
      <script>
          var canvas;
          var stage;
  
          var img = new Image();
          var bmpAnimList;
  
          function init() {
              //find canvas and load images, wait for last image to load
              canvas = document.getElementById("testCanvas");
  
              // create a new stage and point it at our canvas:
              stage = new createjs.Stage(canvas);
  
              img = new Image();
              img.src = "mobile-graphic-easel-examples-assets-testSeq.png";
              img.onload = handleImageLoad;
          }
  
          function handleImageLoad(event) {
              // grab canvas width and height for later calculations:
              var w = canvas.width;
              var h = canvas.height;
  
              // create spritesheet and assign the associated data.
              var spriteSheet  = new createjs.SpriteSheet({
                  images: [img],
                  frames: {width:64, height:68, regX:32, regY:34},
                  animations: {
                      walkUpRt:[0,19,"walkRt"],
                      walkDnRt:[20,39,"walkUpRt"],
                      walkRt:[41,59,"walkDnRt"]
                  }
              });
  
              // to save file size, the loaded sprite sheet only includes right facing animations
              // we could flip the display objects with scaleX=-1, but this is expensive in some browsers
              // instead, we append flipped versions of the frames to our sprite sheet
              // this adds only horizontally flipped frames:
              createjs.SpriteSheetUtils.addFlippedFrames(spriteSheet, true, false, false);
  
              // we could rewire the "next" sequences to make them work like so:
              // but instead we will use code in the angleChange function.
              /*
               spriteSheet.getAnimation("walkDnRt").next = "walkDnRt_h";
               spriteSheet.getAnimation("walkDnRt_h").next = "walkRt_h";
               spriteSheet.getAnimation("walkRt_h").next = "walkUpRt_h";
               spriteSheet.getAnimation("walkUpRt_h").next = "walkUpRt";
               */
  
              // create a BitmapAnimation instance to display and play back the sprite sheet:
              var bmpAnim = new createjs.BitmapAnimation(spriteSheet);
  
              // start playing the first sequence:
              bmpAnim.gotoAndPlay("walkRt");                //animate
  
              // the callback is called each time a sequence completes:
              bmpAnim.onAnimationEnd = angleChange;
  
              // create a bunch of rats based on the first one, and place them on stage, and in our collection.
              var l = 50;
              bmpAnimList = [];
              for (var i=0; i<l; i++) {
                  bmpAnim.name = "rat"+i;
                  bmpAnim.speed = Math.random()*6+2;
                  bmpAnim.direction = 90;
                  bmpAnim.vX = bmpAnim.speed;
                  bmpAnim.vY = 0;
                  bmpAnim.x = Math.random()*(w-220)+60|0;
                  bmpAnim.y = Math.random()*(h-220)+0|0;
  
                  // have each rat start on a random frame in the "walkRt" animation:
                  bmpAnim.currentAnimationFrame = Math.random()*spriteSheet.getNumFrames("walkRt")|0;
                  stage.addChild(bmpAnim);
                  bmpAnimList.push(bmpAnim);
  
                  // rather than creating a brand new instance each time, and setting every property, we
                  // can just clone the current one and overwrite the properties we want to change:
                  if (i < l-1) { bmpAnim = bmpAnim.clone(); }
              }
  
              // we want to do some work before we update the canvas,
              // otherwise we could use createjs.Ticker.addEventListener("tick", stage);
              createjs.Ticker.addEventListener("tick", tick);
          }
  
          //called if there is an error loading the image (usually due to a 404)
          function handleImageError(e) {
              //console.log("Error Loading Image : " + e.target.src);
          }
  
          function tick(event) {
              // move all the rats according to their vX/vY properties:
              var l = bmpAnimList.length;
              for (var i=0; i<l; i++) {
                  var bmpAnim = bmpAnimList[i];
                  bmpAnim.x += bmpAnim.vX;
                  bmpAnim.y += bmpAnim.vY;
              }
  
              // update the stage:
              stage.update(event);
          }
  
          function angleChange(bmpAnim,animation) {
              //after each sequence ends update the rat's heading and adjust velocities to match
              bmpAnim.direction -= 60;
              var angle = bmpAnim.direction * (Math.PI/180);
              bmpAnim.vX = Math.sin(angle) * bmpAnim.speed;
              bmpAnim.vY = Math.cos(angle) * bmpAnim.speed;
              var nextMap = {walkRt:"walkDnRt",walkDnRt:"walkDnRt_h",walkDnRt_h:"walkRt_h",walkRt_h:"walkUpRt_h",walkUpRt_h:"walkUpRt",walkUpRt:"walkRt"};
              bmpAnim.gotoAndPlay(nextMap[animation]);
          }
      </script>
  </head>
  
  <body onload="init();">
  
  <header id="header" class="EaselJS">
      <h1><span class="text-product">Easel<strong>JS</strong></span> Bitmap Animation</h1>
      <p>Dev sample showing how to use <strong>SpriteSheet</strong>, <strong>BitmapAnimation</strong>,
          and <strong>SpriteSheetUtils.addFlippedFrames()</strong>.</p>
      <p>Some browsers can not load images or access pixel data when running local files, and may throw a security error or not
          work unless the content is running on a server.</p>
  </header>
  
  <div class="canvasHolder">
      <canvas id="testCanvas" width="960" height="400"></canvas>
  </div>
  </body>
  </html>
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.