JavaScript|アスペクト比守ったままCanvasに最大幅表示する関数

勘違いしながらどハマりしながら作り上げる爺の『JavaScript奮闘記』。今回は、アスペクト比を守ったままCanvasにフィットする最大の大きさを求める関数を作ります。

ポク太郎です。JavaScriptで自作RPG製作中です。

まぁゲームに限らず、Canvas内にアスペクト比を守ったまま最大幅でフィットさせたい場合が多々あります。

座標計算苦手ジジイで常にこの件に苦労するので、メモとしてページに投稿しておきます。


アスペクト比守ったままCanvas内に最大幅で表示

やりたいことはこれ。サンプル作るの面倒なので、現在制作中のゲーム画面にて。縦幅足りない場合は横幅が縮まるけど、足りてるなら横幅全部表示に使うケース。

横幅-+縦幅-+ボタンでスクリーンサイズが変化するので動きを試せます。

スクリーンサイズとは通常window.innerWidthwindow.innerHeightとする部分。ゲームでは<canvas></canvas>が設置される場所のこと。

スクリーンサイズ変更     
移動:テンキー2468、WADX
OK、キャンセル、アクション:M、N、Jキー
高速化(トグル)、高速化:T、Hキー
Xinputのパッドでも操作可。※まだマップ準備してない場所へ入り込むとフリーズします。使わせてもらった音源はこちら

JavaScriptソース

イベントリスナにてブラウザの窓サイズが変更された場合に飛ぶWmSize()関数です。

WmSize()関数にて変数gWidthgHeightを得ます→その値で仮想画面を実画面に転写。

//【】								ブラウザサイズ変更
function WmSize(){
	ca = document.getElementById( 'can' );			//mainキャンバス要素取得
	rg = ca.getContext( '2d' );				//2D描画コンテキスト取得
	ca.width = window.innerWidth;				//キャンバスサイズ変更
	ca.height = window.innerHeight;				//キャンバスサイズ変更

	//実画面サイズ計測→アスペクト比維持したままの最大サイズ計測
	gWidth = ca.width;
	gHeight = ca.height;
	var W=SCR_W;var H=SCR_H;
	var asp=H/W;
	var kw=gWidth/W;
	var kh=gHeight/(2*H-W)/asp;
	if(kw*(2*H-W)*asp>gHeight){
		gWidth = W * kh;
		gHeight = H * kh;
	}else{
		gHeight = H * kw;
	}
}

vaは仮想画面、変数SCR_W・変数SCR_Hは仮想画面の幅と高さ。

//【】								仮想画面→実画面転写
	rg.drawImage( va, 0, 0, va.width, va.height, 0, 0, gWidth, gHeight*SCR_W/SCR_H );

少し作り始めてこんな感じでいいのかな?→なぜか思い通りの動きが先に出来上がってしまい、縦と横でなぜ等価な式にならないんだろう…?と悩み続けるジジイ。

横幅を優先して決めてんだから当たり前なんだけど、うまくいっても悩み続ける、大抵のことはうまくいかずに悩み続ける。

いやはや、どちらにケースにぶち当たっても時間の掛かるジジイです。





コメント

タイトルとURLをコピーしました