Canvas
Canvasについて
JavaScriptでゲームを作るとなると、ほぼほぼ出てくるのがCanvasです。
Web API(Web Application Programming Interface)に組み込まれており、Canvas APIのCanvasを利用します。
HTMLのcanvas要素を使ってグラフィックを描くのに用いられます。
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>開発環境</title>
</head>
<body>
<canvas id="canvas" width="300" height="300"></canvas>
<script type="text/javascript" src="canvas.js"></script>
</body>
</html>
300 * 300 のcanvas要素を用意してみました。
1枚の紙のようなイメージですね。
これだけだと何も描いていないので、真っ白です。
色を塗ってみる
真っ白なcanvasに色を塗ってみます。
色を塗る、というのは正確ではありません。
正確にはcanvasいっぱいに図形を描くことによって、canvasに色を塗ります。
window.onload = function() {
// HTML からcanvas要素を取得しています。
const canvas = document.getElementById('canvas');
// canvasからcontextを取得しています。
const context = canvas.getContext('2d');
// 塗りつぶしの色を設定する
context.fillStyle = 'rgba(120, 150, 120, 1)';
// 塗りつぶしの実行
// (0, 0)からcanvasの横幅と高さで図形を描画する
context.fillRect(0, 0, canvas.width, canvas.height);
context.fillStyle = 'rgba(255, 255, 255, 0.4)';
// (100, 150)から幅100高100の図形を描画する
context.fillRect(100, 150, 100, 100);
}
ハイライトされている2行は、HTMLからcanvas要素を取得し、取得したcanvasからcontextを取得しています。
canvasに描画をしたい場合、実際にはcanvasが持つcontextを利用して描画することになります。
引数の'2d'は2Dの図形を扱うため、2D用のcontextを返すように指定しています。
3Dを扱いたい場合は引数に'webgl'を指定します。
四角形を描画する場合は
context.fillText(x, y, width, height)
x: 描画開始位置のx座標
y: 描画開始位置のy座標
width:四角形の横幅(-にするとx座標から左に向かって描画される)
height:四角形の高さ (-にするとy座標から上に向かって描画される)
文字を描いてみる
次に文字を描いてみます。
// 文字の色の指定
context.fillStyle = 'rgba(250, 250, 250, 1)';
// canvasの(10, 10)の位置に文字を描画する
context.fillText('文字の色は' + context.fillStyle, 10, 10);
// 文字サイズとフォントの指定
context.font = "24px MS明朝";
context.fillText('文字サイズを大きくする', 10, 50);
// canvasに収まりきらない場合は見切れる
context.strokeText('文字サイズを大きくする', 100, 80);
context.font = "bold 20px MSゴシック";
// rgba() は red green bule alpha(透明度を0-1で指定する)
context.fillStyle = 'rgba(250, 250, 250, 0.5)';
// 四つ目の引数に最大幅を指定すると自動的に調整してくれる
context.fillText('↑文字の輪郭のみ 半透明もできる', 10, 110, 290);
context.fillText('x座標から最大幅300で描画しようとする', 10, 140, 300);
canvas.jsの塗りつぶし処理の下に追記しました。
注意することは特にないかと思います。
一つ不便なことを挙げるとすると、改行記号を利用しても改行できないことです。
なので、テキストのサイズ分下げて描画するしかありません。
テキストを描画する場合は
context.fillText(Sring, x, y, [maxWidth])
String: 描画したい文字列
x: 描画を開始位置のx座標
y: 描画を開始位置のy座標
[maxWidth]: 描画領域の最大幅(省略可能)
※最大幅を省略するとテキストが見切れることがあります。
最後に
最後にクラスにまとめておきたいと思います。
class CanvasClass {
constructor() {
this.canvas;
if(document.getElementById('canvas') === null) {
this.canvas = document.createElement('canvas');
this.canvas.width = 300;
this.canvas.height = 300;
document.body.append(this.canvas);
} else {
this.canvas = document.getElementById('canvas');
}
this.context = this.canvas.getContext('2d');
}
getCanvas() {
return this.canvas;
}
getContext() {
return this.context;
}
setCanvasSize(w, h) {
this.canvas.width = w;
this.canvas.height = h;
}
}
これだけです。
クラスの章で少しふれましたが、一つのクラスに一つの関心毎にした方が後々便利です。
ただ、プログラミングの世界に正解はありません。
というのも、電車のSuicaやETCなどのように処理をできる限り早くしたい場合もあれば、
後々、他の人がメンテナンス・拡張(改造)しやすい場合があるからです。
もちろん、使わない方がいいメソッドやキーワードもあります。
しかし、こだわればこだわるほど迷子になるので、最終的に動いていれば正義です。
アドバイスは優しい人がしてくれると信じて、いろいろやってみてください。