์บ๋ฆญํฐ๋ฅผ ๋ฐ๊พธ๋ฉด ๋ชจ๋ ๊ฒ ์ด๊ธฐํ ๋๊ณ
๋ชจ๋ ์์๋ฅผ ๋ค์ ์ ํํด์ผ ํ๋ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
๋ช ๊ฐ์ง์ ํด๊ฒฐ์ฑ ์ ์๊ฐํด๋ดค์๋ค.
https://mayongee.tistory.com/626
2. ๋ฒํผ์ ํด๋ฆญํด์ canvas ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐฐ๊ฒฝ ์๊ณผ ๋ณ๊ฐ๋ก ์ด๋ฏธ์ง url ์ ๋ณ์๋ก ๊ฐ์ง๊ณ ์๊ธฐ
์ด์ ๋จ๊ณ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ฐ (๋ฐฐ๊ฒฝ์ ํฌ๋ช ์ผ๋ก)
=> ๋ฐฐ๊ฒฝ์ด ๋ณ๊ฒฝ ๋ ๋ -> ๋ฐฐ๊ฒฝ ๊น๊ณ ๋ค์ ๋ก๋
=> ๋ค๋ฅธ ๋ฒํผ ๋๋ฅผ ๋ -> ์ ๋ฐ์ดํธ
์ด๋ฐ ์์ผ๋ก ํ ์ ์์ง ์์๊น...?
๊ฐ๋ฅํ์ง ํด๋ณด๊ธฐ๋ก ํ๋ค.
๐ก ๋จผ์ ์บ๋ฆญํฐ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์บ๋ฆญํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์ด์ ์บ๋ฒ์ค ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํด๋๊ณ , ์บ๋ฆญํฐ๋ฅผ ๊ทธ ์์ ๋ก๋ํด์ค๋ค
๋ผ๋ ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ ค๊ณ ํ๋๋ฐ, ํ๋ค๊ฐ ์ ๋ฐ๋ณด๋ค ๊นจ๋ฌ์๋ค.
๊ทธ ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง๊ณ ์์ด๋ดค์, ์ด์ฐจํผ ๊ทธ ์์ ๋ง์์์ง๊ธฐ ๋๋ฌธ์
=> ์บ๋ฆญํฐ๊ฐ ๋ ธํธ๋ถ ์๋ก ์๋ฒ๋ฆฌ๋ ์ธ๋ชจ์๋ ์ด๋ฏธ์ง๊ฐ ๋์ด๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ค...!
์์๋๋ก ๊ทธ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ญ๊ฐ ์์๊น ํ๋ค๊ฐ
ํด๋์ค ์ด๋ฆ์ ๋ฐฐ์ด์ ๋ฃ์ด์ฃผ๋ฉด ์์๋๋ก ์ ์ฅํ ์ ์๊ฒ ๋จ ์๊ฐ์ด ๋ค์๋ค.
const fixedItemArray = [];
const drawImage = (buttonClass) => {
const image = new Image();
image.src = findingImgSrc(buttonClass);
context.drawImage(
image,
0,
0,
CANVAS_WIDTH,
CANVAS_HEIGHT
);
};
const fixedItemButtonClick = (event) => {
let buttonClass = event.target.className;
fixedItemArray.push(buttonClass);
context.beginPath();
drawImage(buttonClass);
};
const onCharacterBtnClick = (event) => {
let buttonClass = event.target.className;
//์บ๋ฆญํฐ๊ฐ ์บ๋ฒ์ค์ ์๋ ๊ฒฝ์ฐ -> ์ถํ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๊ฐ ์ธํ
๋ ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝ
if (!isCharacterOnCanvas) {
drawImage(buttonClass);
isCharacterOnCanvas = true;
} else if (isCharacterOnCanvas) {
// ์บ๋ฆญํฐ๊ฐ ์ด๋ฏธ ์บ๋ฒ์ค์ ์๋ ๊ฒฝ์ฐ - ์ด๊ธฐํ ํ ๊ทธ๋ ค์ฃผ๊ธฐ
context.beginPath();
context.fillStyle = 'white';
context.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
console.log(fixedItemArray);
drawImage(buttonClass);
fixedItemArray.map((item) => drawImage(item));
isCharacterOnCanvas = true;
}
};
์์ดํ ๋ค์ ์บ๋ฒ์ค์ ๊ทธ๋ ค์ง ๋ ๊ทธ ์์๋๋ก ๋ฐฐ์ด์ ๋ฃ์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ์บ๋ฆญํฐ๋ฅผ ๋ฐ๊ฟ ๋ ๊ทธ ์์๋๋ก ๋ค์ ๊ทธ๋ ค์ง๋ค.
์ง์~~ ๊น๋ฐ์ ์์ด ์ ๋ฐ๋๋ ๊ฑธ ํ์ธํ ์ ์๋ค!
์ ๊ทผ๋ฐ ์์ง ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ๊ฐ ์ด๊ธฐํ ๋๋ ๊ฑด ํด๊ฒฐํ์ง ๋ชปํ๋ค.
ํ ๊ทผ๋ฐ ์ด์ฐจํผ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๊ฑด,, ๋ฐฐ๊ฒฝ๊ณผ๋ ๋ถ๋ฆฌํด๋ ๋๋ ๊ธฐ๋ฅ์ด๋ผ ์๊ฐ๋๋ค.
๋ฐฐ๊ฒฝ + ์บ๋ฆญํฐ & ์์ดํ ๋ฐฐ์น ํ, ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์๋ ๊ธฐ๋ฅ์ ์๋ดํด์ค๋ ๋ ๊ฒ ๊ฐ๋ค.
๋ฌดํผ ๋ฐฐ์ด์ ์ด์ฉํ ๋ฐฉ๋ฒ์ ํ์ฅ์ํค๋ฉด
๋ ธํธ๋ถ๋ ์ฑ ์ ๋ค๋ก ๊ฐ๋ ๊ฑธ ๋ฐฉ์งํ ์ ์์ง ์์๊น..? ์๊ฐ๋ ๋ค์๋ค.
์ง๊ธ์ ์ฑ ์๊ณผ ๋ ธํธ๋ถ์ ๊ณ ์ ๋ ์์ดํ ๋ฐฐ์ด ์์ ๊ฐ์ด ๋ฃ๊ณ ์๋๋ฐ,
- ๋ฐฐ์ด ์์๋ฅผ ์ฑ ์ ๋จผ์ ๋ก ๋ฐ๊พผ ํ ๊ทธ๋ ค์ฃผ๊ธฐ
- ๊ฐ์ ์นดํ ๊ณ ๋ฆฌ์ ์์ดํ ์ด ์ค๋ณต๋๋ฉด ๊ธฐ์กด์ ์์ดํ ์ ์ง์์ฃผ๊ธฐ
์ด๋ ๊ฒ ๋๊ฐ์ง ์์ ์ด ํ์ํ๋ค.
const fixedItemButtonClick = (event) => {
let buttonClass = event.target.className;
//๊ฐ์ ์นดํ
๊ณ ๋ฆฌ๋ ์ญ์ ํด์ค ํ ๋ฃ์ด์ฃผ๊ธฐ
if (buttonClass.includes('desk')) {
fixedItemArray = fixedItemArray.filter(
(item) => !item.includes('desk')
);
fixedItemArray.push(buttonClass);
}
if (buttonClass.includes('laptop')) {
fixedItemArray = fixedItemArray.filter(
(item) => !item.includes('laptop')
);
fixedItemArray.push(buttonClass);
}
context.beginPath();
console.log(fixedItemArray);
fixedItemArray.sort().map((item) => drawImage(item));
};
๊ทธ๋์ ์ฝ๋๋ฅผ ์ด๋ ๊ฒ ์์ ํ๊ณ !
๋ค๋ฅธ ์์ดํ ์ ๋ฐ๊ฟ ๋๋ ์์๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ ๋๋ ์ผ์ด ์ฌ๋ผ์ก๋ค! ์ผํธ!
....?? ๊ทผ๋ฐ ๋ฌธ๋ ์ ์ด๋ถํฐ ์บ๋ฆญํฐ ํ๋, ์ฑ ์ ํ๋, ๋ ธํธ๋ถ ํ๋,, ์ด๋ฐ ์์ผ๋ก ํ๋๋ง ๋ค์ด๊ฐ์๋ ๋ฐฐ์ด ๋ง๋ค์ด์ ์ด๋ ๋ฒํผ์ ํด๋ฆญํ๋ canvas ์ ๊ทธ๋ ค์ฃผ๋ฉด ๋๋๊ฑฐ ์๋....???? ๋ผ๋ ์๊ฐ์ด ์ค์ณ๊ฐ๋ค....
๋์๋...????
๊ทธ๋ผ ์. ์ ๋ฆฌํด๋ณด์.
์ง๊ธ ํ๋ ค๊ณ ํ๋ ๊ฑด
1. ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ๊ฐ ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ํด๊ฒฐ.
2. ์บ๋ฆญํฐ, ์ฑ ์, ๋ ธํธ๋ถ ์ด๋ฏธ์ง๋ฅผ ํ ๋ฐฐ์ด์ ๋ฃ๊ณ ํ๋ฒ์ ๊ทธ๋ ค์ฃผ๊ธฐ.
์ด๋ค.
2๋ฒ์ ๋ฆฌํํ ๋ง์ ๊ฐ๊น์ด ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ ๋ช ๋ฐฑํ ์ค๋ฅ์ธ 1๋ฒ ๋จผ์ ํด๊ฒฐํด๋ณด๊ธฐ๋ก!
2-1. input ์ผ๋ก ๋ฐ์์ค๋ ์ปฌ๋ฌ๋ช ์ ์ฅ
let backgroundColor = 'whtie';
const onColorChange = (event) => {
context.beginPath();
const pickColor = event.target.value;
context.strokeStyle = pickColor;
context.fillStyle = pickColor;
backgroundColor = pickColor;
};
์ปฌ๋ฌ๋ฅผ ์ง์ ํ ๋ ์ ์ญ ๋ณ์์ธ backgroundColor ์ ์ ํํ ์ปฌ๋ฌ๋ฅผ ๋ฃ์ด์ค๋ค.
backgroundColor ๋ ๊ธฐ๋ณธ์ผ๋ก white ๋ก ์ค์ ๋์ด ์๋ค.
const onCharacterBtnClick = (event) => {
...
// ์บ๋ฆญํฐ๊ฐ ์ด๋ฏธ ์บ๋ฒ์ค์ ์๋ ๊ฒฝ์ฐ - ์ด๊ธฐํ ํ ๊ทธ๋ ค์ฃผ๊ธฐ
context.beginPath();
context.fillStyle = backgroundColor;
context.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
console.log(fixedItemArray);
drawImage(buttonClass);
fixedItemArray.map((item) => drawImage(item));
}
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฆผ์ ๋ค์ ๊ทธ๋ ค์ค ๋ ๊น์์ฃผ๋ ๋ฐฐ๊ฒฝ์ background ์ปฌ๋ฌ๋ฅผ ๋ฃ์ด์คฌ๋ค.
์ค! ๊ทธ๋ฌ๋๋ ์ด์ ์บ๋ฆญํฐ๋ฅผ ๋ณ๊ฒฝํด๋ ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ๊ฐ ๊ทธ๋๋ก ์ ์ง๋๋ ๊ฑธ ๋ณผ ์ ์๋ค!
๋์ ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ๋ฅผ ๋ฐ๊พธ๋ฉด ๋ชจ๋ ์์ดํ ์ด ๋ค ์ฌ๋ผ์ง๋ ๋ฌธ์ ๊ฐ ๋จ์์๋ค.
์๊น์ฒ๋ผ ๋ฐฐ์ด์ ์ ์ฅ๋ ์์ดํ ์ ๋ฐฐ๊ฒฝ์ด ๋ณ๊ฒฝ ๋ ํ์ ๋ค์ ๋ฟ๋ ค์ฃผ์.
const onCanvasClick = () => {
if (isFilling) {
context.beginPath();
context.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
fixedItemArray.map((item) => drawImage(item));
}
};
์ฑ์ฐ๊ธฐ ๋ชจ๋์ผ ๋ canvas ๋ฅผ ํด๋ฆญํ๋ฉด
์๋๋ ๋ฐฐ๊ฒฝ์๋ง ๋ณ๊ฒฝ๋์ง๋ง, ์ด์ ๊ธฐ์กด ์์ดํ ๋ค๋ ๊ทธ๋ ค์ฃผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
์ด.. ์ ์๋...? ์ด๋ ๊ฐ์ จ์ด์...?
์ด๊ฑธ ํด๊ฒฐํ๋ ค๋ฉด ์๊น ๋ ์ฌ๋ ธ๋ ์บ๋ฆญํฐ, ๋ ธํธ๋ถ, ์ฑ ์์ ํ ๋ฐฐ์ด์์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผํ๋ค.
ํ์ฐ์ ์ธ ๋ฐฉ๋ฒ์ด์๊ตฐ!
id ๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ฃผ๊ธฐ๋ก ํ๋ค.
๋ฐฐ์ด ๋ด์์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋ถ๋ฅํ๊ธฐ ์ํด์์ด๋ค.
๋ฐฐ์ด ๋ง๊ณ ์ด๋ด ๋ obj ๋ฅผ ์จ์ผํ๋๊ฒ ์๋๊ฐ ๋ผ๋ ์๊ฐ๋ ์ค์ณ๊ฐ๋ค. obj ๋ก ๋ง๋ค๋ฉด.. ์ข ๋ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์์ง ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ์์ดํ ์ ์ ์ฅํ๋ ๋ฐฉ์์ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ๋ฉด์,
๋์์ ์ด๊ธฐ ์บ๋ฒ์ค๋ฅผ ๋น ์บ๋ฒ์ค๊ฐ ์๋ ๊ธฐ๋ณธ ์์ดํ ์ด ์๋ ๋ชจ์ต์ผ๋ก ์ธํ ํ๊ธฐ๋ก ํ๋ค.
const profileItems = {
character: 'character_quokka_button',
desk: 'desk3_button',
laptop: 'laptop1_button',
};
๊ทธ๋ฆฌ๊ณ ์ด๋ค ๋ฒํผ์ ๋๋ฅด๋ ๊ธฐ์กด์ ์ด๋ฏธ์ง๋ค์ ์์ ์ง์ฅ์์ด ๋ณ๊ฒฝํด์ฃผ๋ ํ๋์ ํจ์๋ฅผ ์์ฑํ๋ค.
const drawOrderedItems = () => {
Object.values(profileItems).map((item) =>
drawImage(item)
);
};
const changeProfileItems = (event) => {
let buttonClass = event.target.className;
if (buttonClass.includes('character')) {
profileItems['character'] = buttonClass;
}
if (buttonClass.includes('desk')) {
profileItems['desk'] = buttonClass;
}
if (buttonClass.includes('laptop')) {
profileItems['laptop'] = buttonClass;
}
context.beginPath();
context.fillStyle = backgroundColor || 'white';
context.fillRect(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
drawOrderedItems();
};
๋ฐฐ๊ฒฝ์ปฌ๋ฌ๋ ์ง์ ํ์ง ์์ ์๋ค๋ฉด white ๋ฅผ ๋ฃ์ด์ฃผ๋๋ก ์์ฑํ๋ค.
์ ์ด์ ์์ดํ ๊ฐ์ฒด๊ฐ ๊ทธ๋ ค์ง๋ ์์๋๋ก ์์ฑ๋์ด ์์ด์ sort ๋ฑ์ ํ์ฉํด ์ฌ์ ๋ ฌ ํด์ค ํ์๊ฐ ์์ด์ก๋ค.
ํ์ง๋ง ์ด๋ฏธ์ง ๋ก๋๊ฐ ๋ฆ์ ์, ์บ๋ฆญํฐ๋ง ์๊ฑฐ๋ ํ๋ ํ์์ด ๊ณ์ ๋ฐ๊ฒฌ๋์ด
window ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ค.
window.onload = drawOrderedItems;
๋ค๋ฅธ ๋์์ผ๋ก DOMCotentLoaded๋ ์์์ง๋ง, ์ด๋ฏธ์ง ๋ก๋๋ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๋๋คํด์
window.onload ๋ฅผ ์ฌ์ฉํ๋ค.
๊ทธ๋์ ์ด ์ฑ์ ์ฒ์ ๋ณด์ฌ์ง๋ ๊ธฐ๋ณธ ํ๋กํ ๋ชจ์์ ์ด๋ ๋ค.
์ฌ-ํ!
์ด์ ๊ฑฐ์ ์์ฑ๋ ๊ฒ ๊ฐ์๋ฐ..!!!
ํ๋ ์ฐจ์,,,, ํ ์ปฌ๋ฌ๋ฅผ ๋ณ๊ฒฝํ์ ๋๋ ๋ฐฐ๊ฒฝ ์ปฌ๋ฌ๊ฐ ๊ฐ์ด ๋ฐ๋์ด๋ฒ๋ฆฌ๋ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
์ฝ๊ฐ ๋นํฉํด์ ์ด์ง ๋ฉ์นซํจใ ใ ใ ใ ใ ใ
ํ ์๋ฌด๋๋ ์ด ๋ฌธ์ ๋,,
๊ทธ๋ฆฌ๊ธฐ ๋ฒํผ๊ณผ ์ฑ์ฐ๊ธฐ ๋ฒํผ์ ๋ฐ๋ก ๋ถ๋ฆฌํ๊ฑฐ๋,
์๋ ํ๋กํ์ 1์ฐจ ์์ฑํ๊ณ ๊พธ๋ฏธ๊ธฐ ๋ชจ๋์ ๋ค์ด๊ฐ์ ๊ทธ๋ฆฌ๊ธฐ๋ฅผ ํ์ฉํด์ฃผ๋ ์์ผ๋ก ํด์ผ๊ฒ ๋ค.
๋ญ ๋ฌดํผ ๋ฒํผ์ ๋ฐ๋ก ๋ถ๋ฆฌํด์ผํ๋ ๊ฑด ๊ฐ์ ๋ด์ฉ์ด์ง๋ง.
๋ค์์ ํด๊ฒฐํ ๋ฌธ์
1. ๊ทธ๋ฆฌ๊ธฐ๋ชจ๋์ ์ฑ์ฐ๊ธฐ ๋ชจ๋ ๋ถ๋ฆฌํ๊ธฐ
2. ๋ง์ฝ ์ด๋ฏธ์ง๋ฅผ ๋ฐฐ๊ฒฝ์ผ๋ก ๋ฃ๋๋ค๋ฉด ?
์ฐธ๊ณ ๋ฌธํญ
https://kihyeoksong.tistory.com/71
https://developer.mozilla.org/ko/docs/Web/API/Document/DOMContentLoaded_event
https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event
'๐ช ํ ์ด ํ๋ก์ ํธ > ๐ผ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[7] ๊ธฐ์ ์คํ์ ๋ฐ๊พธ๊ธฐ ์์ ์ ํด์ผ ํ ๊ฒ๋ค (1) | 2024.09.23 |
---|---|
[5] Canvas Api ๋ ํ๊ฒน์ด์ผ - ์ด๋ฏธ์ง ๊ต์ฒด ๋ฒํผ ์์ ํ๊ธฐ (2) | 2024.09.07 |
[4] ์ด๋ฏธ์ง ์ ์ฅํ๋ ๋ฒํผ ๋ง๋ค๊ธฐ (0) | 2024.09.05 |
[3] ์ฌ์ฉํ ์ด๋ฏธ์ง ์ ์ & ์บ๋ฒ์ค์ ์ด๋ฏธ์ง ๋ฃ๋ ๋ฒํผ ๋ง๋ค๊ธฐ (0) | 2024.09.03 |
[2] Canvas API ํ์ฉํ๊ธฐ (7) | 2024.08.28 |