(C)WorldWideSoftware

<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>屋内⇔屋外 切り替え演出</title>
 </head>
 <body>
  <canvas id="bg" width="640" height="640"></canvas><br>
  <a href="http://www.wwsft.com">(C)WorldWideSoftware</a><br>
【説明】屋根の下に出入りする処理のサンプルです。
カーソルキーで勇者を4方向に移動してご確認下さい。
「マップデータ」と「屋根のある場所のデータ」を二次元配列で定義しています。
屋根のある場所のデータには出入りする場所のデータも定義しています。
今いるのは屋外か、屋内かを、plZという変数で管理し、その値によって屋根の表示(屋内にいる場合は屋外を見えなくする表示)を行っています。<br>
<a href="roof00src.html">ソースコードの確認</a>

  <script>
  //描画面(キャンバス)の準備
  var cvs = document.getElementById("bg");
  var ctx = cvs.getContext("2d");

  //キー入力
  var key = 0;
  window.onkeydown = function(ev) { key = ev.keyCode; }
  window.onkeyup = function(ev) { key = 0; }

  //マップを配列で定義する 0草、1室内床、2岩、3室内壁
  var MAP = [
   [2,2,2,3,3,3,3,3,2,2],
   [2,0,0,3,1,1,1,3,0,2],
   [2,0,3,3,1,1,1,3,0,2],
   [2,0,3,1,1,1,1,3,0,2],
   [2,0,3,3,1,3,3,3,0,2],
   [2,0,0,0,0,0,0,0,0,2],
   [2,0,0,0,0,0,0,0,0,2],
   [2,0,0,0,0,0,0,0,0,2],
   [2,0,0,0,0,0,0,0,0,2],
   [2,2,2,2,2,2,2,2,2,2]
  ];

  var MAP2 = [//値1と2が屋外⇔屋内を切り替える場所 値4は屋根のある場所
   [0,0,0,4,4,4,4,4,0,0],
   [0,0,0,4,4,4,4,4,0,0],
   [0,0,4,4,4,4,4,4,0,0],
   [0,0,4,4,4,4,4,4,0,0],
   [0,0,4,4,2,4,4,4,0,0],
   [0,0,0,0,1,0,0,0,0,0],
   [0,0,0,0,0,0,0,0,0,0],
   [0,0,0,0,0,0,0,0,0,0],
   [0,0,0,0,0,0,0,0,0,0],
   [0,0,0,0,0,0,0,0,0,0]
  ];

  var plX = 1, plY = 8;//プレイヤーキャラの座標
  var plZ = 1;//値1が屋外にいる、値2が屋内(屋根の下)にいる
  var idx = 0;//処理 0=移動、1=画面切り替え
  var tmr = 0;//処理のタイマー

  //画像の読み込み
  var img = [], iOK = [];
  function loadImg(n, fname) {
   iOK[n] = false;
   img[n] = new Image();
   img[n].src = fname;
   img[n].onload = function() { iOK[n] = true; }
  }

  loadImg(0, "kusa.png");
  loadImg(1, "yuka.png");
  loadImg(2, "iwa.png");
  loadImg(3, "kabe.png");
  loadImg(4, "yane.png");
  loadImg(5, "yuusya.png");

  //メイン処理
  function mainProc() {
   var n, x, y;

   tmr ++;

   switch(idx) {

   case 0://移動処理

   //プレイヤーキャラの移動
   x = plX;//現在の位置
   y = plY;
   if(key == 38) y--;//カーソル↑
   if(key == 40) y++;//カーソル↓
   if(key == 37) x--;//カーソル←
   if(key == 39) x++;//カーソル→
   if(MAP[y][x] <= 1) {//移動しようとしているところが床だったら
    plX = x;
    plY = y;
    n = MAP2[plY][plX];
    if((n == 1 || n == 2) && n != plZ) {//出入りする場所だったら
     plZ = n;
     idx = 1;//画面切り替え演出に移行する
     tmr = 0;
     break;
    }
   }

   //背景を描画
   for(y=0; y<10; y++)
   for(x=0; x<10; x++) {
    n = MAP[y][x];
    if(iOK[n] == true) ctx.drawImage(img[n], x*64, y*64);
   }

   //プレイヤーキャラを表示
   if(iOK[5] == true) ctx.drawImage(img[5], plX*64, plY*64-tmr%2);

   //屋根を描画
   for(y=0; y<10; y++)
   for(x=0; x<10; x++) {
    n = MAP2[y][x];
    if(plZ == 1) {//屋外にいる
     if(n == 4) {
      if(iOK[4] == true) ctx.drawImage(img[4], x*64, y*64);//屋根
     }
    }
    else {//屋内にいる
     if(n != 2 && n != 4) {//屋外を黒で塗り潰す
      ctx.fillStyle = "black";
      ctx.fillRect(x*64, y*64, 64, 64);
     }
    }
   }

   break;

   case 1://画面切り替え処理

   //背景を描画
   for(y=5-tmr; y<5+tmr; y++)
   for(x=5-tmr; x<5+tmr; x++) {
    n = MAP[y][x];
    if(iOK[n] == true) ctx.drawImage(img[n], x*64, y*64);
   }

   //プレイヤーキャラを表示
   if(iOK[5] == true) ctx.drawImage(img[5], plX*64, plY*64-tmr%2);

   //屋根を描画
   for(y=5-tmr; y<5+tmr; y++)
   for(x=5-tmr; x<5+tmr; x++) {
    n = MAP2[y][x];
    if(plZ == 1) {//屋外にいる
     if(n == 4) {
      if(iOK[4] == true) ctx.drawImage(img[4], x*64, y*64);//屋根
     }
    }
    else {//屋内にいる
     if(n != 2 && n != 4) {//屋外を黒で塗り潰す
      ctx.fillStyle = "black";
      ctx.fillRect(x*64, y*64, 64, 64);
     }
    }
   }
   if(tmr == 5) idx = 0;
   break;

   }
  }

  setInterval(mainProc, 200);
  </script>
 </body>
</html>

←動作確認に戻る