(C)WorldWideSoftware

<!DOCTYPE html>
<html lang="ja">
 <head>
  <meta charset="utf-8">
  <title>画像演出1</title>
 </head>
 <body>
  <canvas id="bg" width="480" height="240"></canvas><br>
  <a href="http://www.wwsft.com">(C)WorldWideSoftware</a><br>
【説明】<br>
80~90年代の2Dハード風の、敵キャラを倒した時の演出です。<br>
パレットチェンジ、VRAM転送など当時のハードの処理ではなく、通常の画像とメッシュ状のpng画像2枚を使っています。<br>
メッシュ画像は、元の画像を減色し、パレットは赤と青のみ(+透明色)としています。<br>
画像さえ用意すれば実現でき、難しいプログラムは一切不要、どんな開発環境にも使える処理です。<br>
<a href="ef00src.html">ソースコードの確認</a><br>
<br>
使っている画像<br>
<img src="snake1.png">
<img src="snake2.png">

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

  //画像の読み込み
  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, "bg.png" );
  loadImg( 1, "snake1.png" );
  loadImg( 2, "snake2.png" );

  //メイン処理
  var tmr = 0;

  function mainProc() {
   var x, y;
   tmr ++;
   if(iOK[0] == true) ctx.drawImage(img[0], 0, 0);//背景の表示
   if(0 <= tmr && tmr < 30) {
    if(iOK[1] == true) ctx.drawImage(img[1], 120, 40);//敵の通常の画像
   }
   if(30 <= tmr && tmr < 40) {
    ctx.drawImage(img[2], 120,   40);//敵のメッシュ画像
    ctx.drawImage(img[2], 120+1, 40);//敵のメッシュ画像
    ctx.drawImage(img[2], 120, 40+1);//敵のメッシュ画像
   }
   if(40 <= tmr && tmr < 50) {
    ctx.drawImage(img[2], 120,   40);//敵のメッシュ画像
    ctx.drawImage(img[2], 120+1, 40);//敵のメッシュ画像
   }
   if(50 <= tmr && tmr < 60) {
    ctx.drawImage(img[2], 120,   40);//敵のメッシュ画像
   }
   if(60 <= tmr && tmr < 70) {//行を間引いて表示
    for(var y=0; y<160; y+=4) ctx.drawImage(img[2], 0, y, 160, 1, 120, 40+y, 160, 1);
   }
   if(70 <= tmr && tmr < 80) {//更に行を間引いて表示
    for(var y=0; y<160; y+=8) ctx.drawImage(img[2], 0, y, 160, 1, 120, 40+y, 160, 1);
   }
   if(tmr == 100) tmr = 0;//最初から繰り返す
  }
  setInterval(mainProc, 50);
  </script>
 </body>
</html>

←動作確認に戻る