(C)WorldWideSoftware
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>擬似ラスタースクロール</title>
</head>
<body>
<canvas id="bg" width="480" height="480"></canvas><br>
<a href="http://www.wwsft.com">(C)WorldWideSoftware</a><br>
【説明】<br>
ファミコンなどの旧ハードで使われていたラスタースクロール風の演出です<br>
現在のハードにはラスタースクロールさせる機能はありませんが、三角関数などで実現できます<br>
<a href="rs00src.html">ソースコードの確認</a><br>
<a href="http://www.wwsft.com/ohq/">画像は無料RPG「One Hour Quest」のものです</a>
<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, "bg0.png" );
loadImg( 1, "bg1.png" );
//メイン処理
var idx = 0;
var tmr = 0;
var bg = 0;//どちらの画像を表示するか
window.onload = mainProc();
function mainProc() {
var x, y;
tmr ++;
switch(idx) {
case 0://停止画面
if(iOK[bg] == true) ctx.drawImage(img[bg], 0, 0);
if(tmr == 60) {
idx = 1;
tmr = 0;
}
break;
case 1://演出前半
for(y=0; y<480; y+=8) {
x = parseInt( 4*tmr*Math.cos(Math.PI*(y*2+tmr*8)/360) );//振幅を計算する
ctx.drawImage(img[bg], 0, y, 480, 8, x, y, 480, 8);
}
ctx.fillStyle = "rgba(0,0,0," + tmr/100 + ")";//黒を重ね画面を暗くしていく(最初は薄い黒→徐々に濃い黒をアルファ値で設定)
ctx.fillRect(0,0,480,480);
if(tmr == 100) {
idx = 2;
tmr = 0;
bg = 1-bg;//画像番号を切り替える
}
break;
case 2://演出後半
for(y=0; y<480; y+=8) {
x = parseInt( 4*(100-tmr)*Math.cos(Math.PI*(y*2+(100-tmr)*8)/360) );//振幅を計算する
ctx.drawImage(img[bg], 0, y, 480, 8, x, y, 480, 8);
}
ctx.fillStyle = "rgba(0,0,0," + (100-tmr)/100 + ")";//濃い黒→徐々に薄い黒に
ctx.fillRect(0,0,480,480);
if(tmr == 100) {
idx = 0;
tmr = 0;
}
break;
}
setTimeout(mainProc, 34);
}
</script>
</body>
</html>
←動作確認に戻る