今回は、マップチップのアニメーション処理をしたいと思います。
やり方は、animation用のoffsetX(画像を切り出すX座標)を管理して、
描画するマップチップがアニメーション用のマップチップだった場合にoffSetXを切り替えて、
アニメーションさせるようにします。
そのために、offSetXを切り替えるための関数を用意します。
解説
今回は、マップチップのスクロールを行います。
画像にコインのアニメーションをする画像を追加したので、新しくmap512.pngを入れ替えてください。

まず、const.jsにマップチップアニメーションに関する定数の定義をします。
const.js
MAP_ANIM_NUMがアニメーションマップチップの数で、
MAP_ANIM_FRAMEがマップチップを切り替えるフレーム数です。
// chapter32
// マップチップのアニメーション数
var MAX_MAP_ANIM_NUM = 4;
// マップチップ切り替え数
var MAX_MAP_ANIM_FRAME = 10;
次に、マップチップアニメーションをさせる関数を追加するので、main.jsを開いてください。
main.js
マップチップアニメーションのフレームを管理する変数と
アニメーションのオフセットを管理する変数を追加します。
var gMapAnimFrame = 0;
var gMapAnimOffsetX = 0;
次に、アニメーションをするマップチップかどうかを判定するために、
定数配列を作って、アニメーションをするマップチップの番号を格納します。
コインのマップチップ番号は33なので、とりあえず、33のみを入れます。
// アニメーションマップチップを入れる
var ANIM_MAP_CHIPS = [33];
次に、アニメーションマップチップかを判定する関数を作ります。
/**
  アニメーションマップチップかどうか判定する
  mapIndex : 対象のマップチップインデックス
*/
function isAnimationMap(mapIndex){
  for(var i = 0;i < ANIM_MAP_CHIPS.length;++i){
    if(ANIM_MAP_CHIPS[i] == mapIndex){
      return true;
    }
  }
  return false;
}
続いて、マップチップをアニメーションさせるために、
マップチップのオフセットを調整する関数を定義します。
/**
  マップチップ用のAnimationFrameの処理
*/
function changeMapAnim(){
  if(gMapAnimFrame++ >= MAX_MAP_ANIM_FRAME){
    gMapAnimFrame = 0;
    if(++gMapAnimOffsetX >= MAX_MAP_ANIM_NUM){
      gMapAnimOffsetX = 0;
    }
  }
}
オブジェクト用の描画関数の定義
描画の処理数を減らすために、オブジェクト用の描画関数を定義したいと思います。
マップチップをアニメーションさせるために、
描画する対象がアニメーションのマップチップだった場合は、
先ほど追加した、offsetXを加算することにより、マップチップのアニメーションさせます。
/**
  マップチップオブジェクトを描画
  マップオブジェクトの一部はアニメーションする
  map:対象のマップチップ配列
*/
function drawObjectMap(map){
  // y軸
  for(var y = 0;y < MAX_MAP_Y;++y){
    // x軸
    for(var x = gMario.minDrawMapX;x < gMario.maxDrawMapX;++x){
      if(map[y][x] != NOT_DRAW_MAP){
        var indexX = 32 * ((map[y][x] + 16) % 16);
        // アニメーション用のマップチップの場合、animation offsetを足す
        if(isAnimationMap(map[y][x])){
          indexX += gMapAnimOffsetX * MAP_SIZE;
        }
        var indexY = 32 * Math.floor(map[y][x] / 16);
        g_Ctx.drawImage(gMapTex,indexX,indexY,32,32,x * 32 - gMario.mapScrollX,y * 32,32,32);
      }
    }
  }
}
これで、必要な関数がそろったので、draw関数を修正します。
drawObjectMap関数を読んで、マップチップをアニメーションさせるための、changeMapAnim関数を呼びましょう。
/*
	Draw
	描画
*/
function Draw(){
  // 背景
  drawMap(gBackGroundMapChip);
  // オブジェクト
  drawObjectMap(gMapChip);
	gMario.draw(g_Ctx,gMarioTex);
  gKuribo.draw(g_Ctx,gKuriboTex,gMario.mapScrollX);
  drawCoin(630,10,gMario.coinNum);
  changeMapAnim();
}
これで、マップチップのアニメーション処理が完成したので、実行して確認してみましょう!
ソースはgithubから参照してください。