ウィンドウサイズの拡大縮小に対してもアスペクト比を計算。
比の計算を使う。
ドット絵の拡大縮小でもぼやけないようにする。
"use strict";
const FONT = "48px monospace"; //使用フォント
const HEIGHT = 120; //仮想画面幅
const WIDTH = 128; //仮想画面高さ
const SMOOTH = 0; //描画保管処理
let gScreen; //仮想画面
let gFrame = 0; //内部カウンタ
let gImgMap; //画像(マップ)
let gWidth; //実画面の幅
let gHeight; //実画面の高さ
function DrawMain(){
const g = gScreen.getContext("2d"); //仮想画面の2D描画コンテキストを取得
//仮想画面にマップチップを転送
for( let y = 0; y < 64; y++ ){
for( let x = 0; x < 64; x++ ){
g.drawImage( gImgMap, x * 32, y * 32 );
}
}
g.font = FONT; //文字フォントを設定
g.fillText("Hello World" + gFrame, 0, 64);
}
function WmPaint(){ //毎フレーム処理される
DrawMain();
const ca = document.getElementById("main"); //mainキャンバスの要素を取得
const g = ca.getContext("2d"); //2D描画コンテキストを取得
g.drawImage( gScreen, 0, 0, gScreen.width, gScreen.height, 0, 0, gWidth, gHeight ); //仮想画面のイメージをメインキャンバスに転送
}
//ブラウザサイズ変更イベント
function WmSize(){
const ca = document.getElementById("main"); //mainキャンバスの要素を取得
ca.width = window.innerWidth; //キャンバスの幅をブラウザの幅にする
ca.height = window.innerHeight; //キャンバスの高さをブラウザの高さにする
/**Start 拡大したときにドット絵がクッキリする ****ここから******/
const g = ca.getContext("2d"); //2D描画コンテキストを取得
g.imageSmoothingEnabled = g.msImageSmoothingEnabled = SMOOTH; //保管処理
/**End **************************************ここまで******/
//実画面サイズを計測。ドットのアスペクト比を維持したままでの最大サイズを計測する。
gWidth = ca.width
gHeight = ca.height;
//アスペクト比の計算(比の方程式より) W:H = gW:gH の式で gH = ? の式にするとそうなる
if( gWidth / WIDTH < gHeight / HEIGHT ){
gHeight = gWidth * HEIGHT / WIDTH;
}else{
gWidth = gHeight * WIDTH / HEIGHT;
}
}
//タイマーイベント発生時の処理
function WmTimer()
{
gFrame++; //内部カウンタを加算
WmPaint();
}
//ブラウザ起動イベント
window.onload = function(){
gImgMap = new Image(); //オブジェクト化
gScreen = document.createElement("canvas"); //画僧画面を作成
gScreen.width = WIDTH; //仮想画面の幅を設定
gScreen.height = HEIGHT; //仮想画面の高さを設定
WmSize(); //ウィンドウサイズの設定
window.addEventListener("resize", function(){ WmSize(); }); //ブラウザサイズ変更時に呼び出される
gImgMap.src = "img/map.png"; //マップ画像読み込み
setInterval( function() { WmTimer() }, 33); //33ms間隔で WmTimer() を呼び出すように指示 1000/33 = 30FPS
}
