Closed10

Canvasでお絵描きできるようにする

ツクモンツクモン

Canvas要素を使ってマウスのドラッグ操作で線を引けるようにする。
鋭意制作中。
今は参考サイト丸パクリ状態です。
ここから改良してきますのでご容赦ください。

ツクモンツクモン

改良点

  • 線の引き始めがずれる
  • Canvas要素を画面真ん中に配置した時に線がかかれない(上に起因する?)
  • コードの理屈を体系的に理解してない
ツクモンツクモン

線の引きはじめのズレを解消

// 線を描く座標をマウスの位置に合わせる
// 現在のマウス位置がページの左上からの相対位置で出力されるので、
// canvas要素の左上の座標を引き算することで実現
const rect = e.target.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
draw(x, y);

参考
https://tech-blog.s-yoshiki.com/entry/90

ツクモンツクモン

コードの書き方も理解してきた。
だいたいこんなイメージか。
canvas内のマウスの座標を取得し、ドラッグが始まった座標から動かした座標へ線を引く、ドラッグ中は前にドラッグされて移動した座標から今ドラッグされて移動した座標への線を引く、マウスが離されたら終了。

moveTo:線の始点に移動する(鉛筆を書き始めに持ってくる)
lineTo:線の終点に移動し、視点とを結ぶ(鉛筆を動かす)
stroke:線が実際に引かれる(紙に線が描かれる)
beginPath:線の書き始めを宣言
closePath:線の書き終わりを宣言
lineCap:線の終わりの形状を指定(roundで丸く)
lineJoin:引かれる線をどのような形状でくっつけるか?

参考
https://developer.mozilla.org/ja/docs/Web/API/CanvasRenderingContext2D
https://developer.mozilla.org/ja/docs/Web/API/MouseEvent

ツクモンツクモン

色変更機能を追加

const colorButtons = document.querySelectorAll(".color");
colorButtons.forEach((btn) => {
	btn.addEventListener("click", () => {
		switch (btn.id) {
			case "black":
				ctx.strokeStyle = black;
				break;
			case "red":
				ctx.strokeStyle = red;
				break;
			case "blue":
				ctx.strokeStyle = blue;
				break;
			case "green":
				ctx.strokeStyle = green;
				break;
			default:
				ctx.strokeStyle = black;
		}
	});
});
ツクモンツクモン

透明度と太さの変更を追加
(透明度だけうまくいかない...線を...線を引く間隔が細かいから塗りつぶされて濃くなるのか...?)

	const sizeChange = document.getElementById("size");
	const size = document.querySelector(".size");
	sizeChange.addEventListener("input", () => {
		size.textContent = `${sizeChange.value}px`;
		ctx.lineWidth = sizeChange.value;
	});

	const alphaChange = document.getElementById("alpha");
	const alpha = document.querySelector(".alpha");
	alphaChange.addEventListener("input", () => {
		currentAlpha = alphaChange.value;
		alpha.textContent = `${currentAlpha}`;
		ctx.strokeStyle = `rgba(${currentColor}, ${currentAlpha})`;
	});
このスクラップは3ヶ月前にクローズされました